首先,派生类的新成员不在基类的作用域内,那么如果基类想要访问派生类的新添加成员就必须只能是派生类对象的成员(情况1)或者派生类的静态数据成员(情况2)。
其次,基类的定义必定是在派生类前面的,那么,基类要想使用派生类的新添加成员,必须对派生类作前置声明。而又因为仅有前置声明是不能定义实体对象的,所以情况1是不可能的。情况2基本同理。
情况1:
class B;//前置声明
B b;//这里会出错,因为编译器此时还不能获取到B的定义,根本无法创建B类的实体对象
class A
{
public:
void f()
{
cout << b.y;//试图访问派生类对象的成员
}
};
class B : public A
{
public:
static int x;
int y;
};
情况2:
class B;//前置声明
class A
{
public:
void f()
{
cout << B::x;//试图访问派生类的静态成员。这里会出错,因为编译器此时还不能获取到B::x的定义
}
};
class B : public A
{
public:
static int x;
int y;
};
当时空穿越时可行。
基类就比如是老祖宗,派生类就好比子孙。如果在远古时代的老祖宗开上了子孙的汽车,你说是不是穿越了呢?