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 输出
您只能覆盖 virtual成员函数。
所有其他成员,无论是函数、类型还是成员变量,都只能被隐藏。
这意味着它们根本不会改变,但如果不参考适当的基础,使用范围解析运算符等就不容易访问。
因此,改为使用虚函数而不是成员变量。
使用虚函数。您不能拥有虚拟字段,因此您获得的值是实例指针 ( 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)