C++ 在这种情况下继承类是如何工作的??? A类{ 公众: A(){foo();} ~A(){foo();} void foo(){cout

C++ 在这种情况下继承类是如何工作的??? A类{ 公众: A(){foo();} ~A(){foo();} void foo(){cout,c++,inheritance,polymorphism,C++,Inheritance,Polymorphism,问题是您有一个非虚拟的foo(),因此a::bar()将调用它知道的唯一的foo(),即a::foo(),即使调用它的是B 尝试: class A { public: A() { foo(); } ~A() { foo(); } void foo() { cout << 3; } void bar() { foo(); } }; class B : public A { void foo() { cout << 2; } }; in

问题是您有一个非虚拟的
foo()
,因此
a::bar()
将调用它知道的唯一的
foo()
,即
a::foo()
,即使调用它的是B

尝试:

class A {
public:
    A() { foo(); }
    ~A() { foo(); }
    void foo() { cout << 3; }
    void bar() { foo(); }
};
class B : public A {
    void foo() { cout << 2; }
};
int main() {
    B b;
    b.bar();
    return 0 ;
}
A类{
公众:
A(){foo();}

virtual~A(){foo();}/必须包含virtual才能覆盖存储在中的功能

添加到

class A {
public:
    A() { foo(); }
    virtual ~A() { foo(); }             // <<---------- recommendation
    virtual void foo() { cout << 3; }   // <<<--------- solves it
    void bar() { foo(); }
};
class B : public A {
    void foo() override { cout << 2; }  // <<---------- recommendation
};

virtualvoidfoo(){cout成员
A::foo
是非虚拟的,因此无论在何处使用都将静态绑定。因此,在编译
A::bar
时,对
foo()
的调用将(静态)绑定到实现
A::foo()
A::foo
中的静态绑定不会因为您稍后创建派生类
B
的实例而改变。 但是,如果在main中调用
b.foo()
,将绑定
b::foo

为了通过
A::bar
调用
B::foo
,您必须将
A::foo
声明为“虚拟:

void foo() override { cout << 2; }
A类{
公众:
A(){foo();}
虚拟~A(){foo();}

虚拟void foo(){我想你是不是想要一个
virtual foo()
My Second:1)即使你将foo()实现为一个虚拟函数,一旦在“a”构造函数中调用,它将运行a::foo()而不是B::foo(),因为还没有创建“B”;2)你不能在析构函数中调用任何虚拟函数,因为“B”可能已经被破坏,取消引用B::foo()指针可能会使应用程序崩溃,或者处理已经被覆盖的内存,或者其他事情。这里我们还不讨论虚拟继承,它会让事情变得更加棘手。
void foo() override { cout << 2; }
class A {
public:
    A() { foo(); }
    virtual ~A() { foo(); }
    virtual void foo() { cout << 3; }
    void bar() { foo(); }
};