#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獲取指向派生類的指針, 檢查強制轉換是否成功, 然後使用派生類指針調用派生類成員函數.
更好的方法是在基類中提供虛擬成員函數, 並在派生類中實現它.
*/