#include <iostream>
using namespace std;
class A
{
protected:
int a;
public:
A() :a(1111) {}
virtual void Show() { std::cout << a << std::endl; }
void ShowInfo() { std::cout <<"A" << std::endl; }
};
class B:public A
{
private:
int b;
public:
B() :b(2222) {}
virtual void Show(){std::cout << b << std::endl;}
void ShowInfo() { std::cout << "B" << std::endl; }
void ShowInfoB() { std::cout << "Class B" << std::endl; }
};
class C :public B
{
private:
int c;
public:
C() :c(3333) {}
virtual void Show(){std::cout << c << std::endl;}
void ShowInfo() { std::cout << "C" << std::endl; }
void ShowInfoC() { std::cout << "Class C" << std::endl; }
};
int main()
{
B b;
C c;
A* pa = &b;
pa->Show(); // 2222
pa->ShowInfo(); // A
//pa->ShowInfoB(); // 无法调用
pa = &c;
if (!pa) return -1;
pa->Show(); // 3333
pa->ShowInfo(); // A
//pa->ShowInfoC(); // 无法调用
// 无法让指向派生类的基类指针 调用 派生类的非虚函数,必须先转化为相应的派生类指针
auto pb = dynamic_cast<B*>(pa);// pb类型为B*
if (!pb) return -1;
pb->Show(); // 3333
pb->ShowInfo(); // B
pb->ShowInfoB(); // Class B(调用成功)
auto pc = dynamic_cast<C*>(pa);// pc类型为C*
if (!pc) return -1;
pc->Show(); // 3333
pc->ShowInfo(); // C
pc->ShowInfoC(); // Class C(调用成功)
pa = &b;
auto ppb = dynamic_cast<B*>(pa);// pb类型为B*
if (!ppb) return -1;
ppb->Show(); // 2222
ppb->ShowInfo(); // B
ppb->ShowInfoB(); // Class B(调用成功)
auto ppc = dynamic_cast<C*>(pa);// 转换失败,因为pa指向的是B,无法向下(B的派生类转)化为,ppc为NULL;
if (!ppc) return -1;
return 0;
}
/*
您不能使用指向基类的指针来调用派生类的非虚拟成员函数.
您将需要一个指向派生类的指针.最简单的方法是使用dynamic_cast获取指向派生类的指针, 检查强制转换是否成功, 然后使用派生类指针调用派生类成员函数.
更好的方法是在基类中提供虚拟成员函数, 并在派生类中实现它.
*/