问题描述
父类声明式子类对象使用直接继承的方法,内部方法的指向问题。示例如下,输出是什么?
class father{
public:
virtual void m1()=0;
virtual void m2() const{
std::cout<<"father-m2"<<std::endl;
}
};
class son:public father{
public:
void m1() override{
}
void m2()const override{
mm();
mstruct s;
std::cout<<s.age<<std::endl;
}
void mm()const{
std::cout<<"son-mm"<<std::endl;
}
struct mstruct{
int age=0;
};
};
class grandSon:public son{
public:
void m1(){
}
void mm() const{
std::cout<<"grandSon-mm"<<std::endl;
}
struct mstruct{
int age=1;
};
};
int main() {
son *s=new grandSon();
s->m2();
std::cout << "Hello, World!" << std::endl;
return 0;
}
实验结果
1.覆盖
输出:
son-mm
0
结果:mm方法与结构体均指向了父类
2.重写
修改son中mm为虚函数,grandSon中mm为override。
son:
virtual void mm()const{
std::cout<<"son-mm"<<std::endl;
}
grandSon:
void mm() const override{
std::cout<<"grandSon-mm"<<std::endl;
}
输出:
grandSon-mm
0
结果:mm方法指向了子类,结构体指向父类
结论
父类声明式子类对象使用直接继承的方法: 1.内部变量不会指向子类同名变量。 2.内部方法的指向会搜索子类的重写,而不搜索其覆盖函数。
|