C++ 覆盖基成员值

See*_*are 2 c++ inheritance class derived base

我有以下代码:

class A
{
public:
    int foo = 0;
};

class B: public A
{
public:
    int foo = 1;
};

int main()
{
    A *a = new B();

    std::cout << a->foo;
    std::getchar();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:0

为什么 B 不覆盖 A 中的成员 foo ?

以及如何在不强制转换为派生类的情况下获得所需的 1 输出

Ded*_*tor 6

您只能覆盖 virtual成员函数。
所有其他成员,无论是函数、类型还是成员变量,都只能被隐藏

这意味着它们根本不会改变,但如果不参考适当的基础,使用范围解析运算符等就不容易访问。

因此,改为使用虚函数而不是成员变量。


Pau*_*ney 5

使用虚函数。您不能拥有虚拟字段,因此您获得的值是实例指针 ( A) 的类型,而不是指向 ( ) 的真实类型B

#include <iostream>
using namespace std;

class A
{
    int foo_ = 0;
public:
    virtual int foo() const { return foo_; }
    virtual ~A(){}
};

class B: public A
{
    int foo_ = 1;
public:
    virtual int foo() const { return foo_; }
};

int main()
{
    A *a = new A();
    A *b = new B();

    cout << a->foo() << '\n';
    cout << b->foo() << '\n';
    cin.ignore();

    delete a;
    delete b;
}
Run Code Online (Sandbox Code Playgroud)