-2

好的,所以我知道有很多多态线程飞来飞去,但我还没有遇到这种情况。

class Base {
public:
    virtual void method1() {
        cout << "BaseMethod1" << endl;
    }

    void method2() {
        cout << "BaseMethod2" << endl;
    }
};

class Derive: public Base {
public:
    void method1() {
        cout << "DeriveMethod1" << endl;
        method2();
    }

    void method2() {
        cout << "DeriveMethod2" << endl;
    }
};

int main() {
    Base* p = new Derive();
    p->method1();
}

让我绊倒的是派生类中的method1调用了method2。那么,既然 Base 类中的 method2 没有被声明为 virtual,那么它会是哪个 method2?

提前谢谢!

4

3 回答 3

4

有问题的代码将无法编译,因为Base::method1()已声明private。它需要public能够从main.


Derived::method1()是隐含的virtual,即使没有标记为virtual。所以thisinDerived::method1()指向一个Dervied对象,在这个范围内编译器只能看到Derived::method2(). 因此Derived::method2()将被调用。派生类中的方法隐藏了基类中相同的命名方法。


好读:

警告:Derived::f(char) 隐藏 Base::f(double) 是什么意思?

于 2013-03-01T04:55:41.160 回答
2

您不经常看到这种模式的主要原因是它实际上是一种反模式。

将调用 Derived 方法,因为您使用 Derived 对象引用 (this) 调用它。如果您使用 Base 类引用调用它,您将获得 Base 方法。

如果您重新声明了一个非虚拟方法,那么您将隐藏基本方法并破坏多态性。

于 2013-03-01T04:59:48.537 回答
1

它将用作从类本身开始的Derive::method2()名称查找(在正文中)。Derive::method1()

于 2013-03-01T04:59:05.940 回答