C++实现多态的时候父类指针如何调用子类独有的数据成员?
class father{
public:
int m_a;
};
class son:public father{
public:
int m_b;
};
int main(){
father* p1 = new father();
father->m_a = 1; //可行
father->m_b = 0; //失败
}
如代码,在遇到这种问题的时候如何解决,或者多态应该如何体现,使用父类指针是否不太方便呢
如果要在父类指针中访问子类中独有的数据成员,可以使用类型转换将父类指针转换成子类指针,然后再访问子类中的数据成员。
例如,可以使用如下代码访问子类中的数据成员:
son* p2 = static_cast<son*>(p1); // 将 p1 转换成 son 类型的指针
p2->m_b = 0; // 访问子类独有的数据成员
通常面向对象不是这个玩法, 父类一般不要有自己的成员, 当然你要有也没人拦着.
多态是由虚函数实现的.
#include <iostream>
class father
{
public:
father() = default;
virtual ~father() = default;
virtual auto getNum() -> int = 0;
};
class son1 : public father
{
int m_a = 0;
public:
auto getNum() -> int override
{
return m_a;
}
};
class son2 : public father
{
int m_b = 1;
public:
auto getNum() -> int override
{
return m_b;
}
};
auto main() -> int
{
father *ptrFather1 = new son1();
father *ptrFather2 = new son2();
int testA = ptrFather1->getNum();
int testB = ptrFather2->getNum();
std::cout << testA << ' ' << testB << std::endl;
delete ptrFather1;
delete ptrFather2;
return 0;
}
在C++中,父类指针只能访问父类中定义的成员,不能访问子类中定义的成员。如果想要访问子类中定义的成员,需要将父类指针强制转换为子类指针。