例如,我有基类A:
class A {
public:
callA() {
val = 100;
std::cout << this->val << std::endl;
}
int val;
}
class B : public A {
public:
B() {
val = 10;
}
int val;
}
B b;
b.callA();
b.callA()
会打印什么?
对于B继承A,如果B没有字段val,B会分享对A的精确引用,还是副本?
答案 0 :(得分:4)
在内部,任何B类实例都包含A类的完整副本。事实上,当您初始化B类的新实例时,首先运行A类构造函数。因此,当您从基类调用非虚函数时,它将像从基类运行一样运行,基类是派生类的内部类。它甚至可以访问基类的私有变量(派生类无法访问它,它只能访问基类中的公共/受保护变量)。
#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout << "Base constructor!" << endl;
privateVar = 10;
}
void testPrint()
{
cout << "privateVar: " << privateVar << endl;
}
private:
int privateVar;
};
class B : public A
{
public:
B()
{
cout << "Derived Constructor!" << endl;
}
};
int main()
{
B testB;
testB.testPrint();
return 0;
}