class b
public:
void f(int) const
cout << "b.int" << endl;
void f(double) const
cout << "b.double" << endl;
class d: public b
public:
void f(void*) const
cout << "d.void" << endl;
int main()
d d;
d.f(0); //呼叫那個函式?
d.f(1); //呼叫那個函式?
d.f(0.1); //呼叫那個函式?
答案:3個呼叫全部呼叫子類的f(void*)。但由於後兩個不能轉換為void*,編譯出錯。void*是可以指向
任何型別的指標。c++中,只有int 0可以轉換為指標型,其餘均不可以,所以出錯。
關於子類函式對父類函式的覆蓋:
在c++類裡面,存在兩個概念,乙個是過載,乙個是覆蓋。
過載只是在類的內部存在,不會傳導到父類和子類中間。即便是乙個函式宣告為virtual,也是這樣。
如果乙個類,存在和父類相同的函式,那麼,這個類將會覆蓋其父類的方法,除非你在呼叫的時候,強制
轉換為父類型別,否則試圖對子類和父類做類似過載的呼叫是不能成功的。
class b
public:
void f(int i) const
printf("b::f(int):%d\n",i);
virtual void f(double d) const
printf("b::f(double):%f\n",d);
class d: public b
public:
void f(void* p) const
printf("b::f(void*):%x\n",p);
void f(int i) const{
printf("d::f(int):%d\n",i);
int main(int argc, char* argv)
d d;
((b*)&d)->f(0); // 強制呼叫,否則父類的f(int)對子類不可見
d.f(1);
((b*)&d)->f(1); //
((b*)&d)->f(0.1); //
d.f(0.1); // warning: conversion from 'const double' to 'int', possible loss of data
d.f(null); // warning: converting null to non-pointer type
return 0;
執行結果:
b::f(int):0
d::f(int):1
b::f(int):1
b::f(double):0.100000
d::f(int):0
d::f(int):0
那麼,對於純虛函式呢,實際情況也是一樣的。例如
class x
public:
virtual void f(int) = 0;
class y:public x
public:
virtual void f(int n)
printf("y::f(int):%d\n",n);
virtual void f(double d)
printf("y::f(double):%f\n",d);
class z:public y
public:
virtual void f(int n)
printf("z:f(int):%d\n",n);
int main()
z z;
z.f(1);
z.f(0.1);
執行結果:
z:f(int):1
z:f(int):0
子類函式對父類同名函式的覆蓋
先看一道題 class b void f double const class d public b int main 答案 3個呼叫全部呼叫子類的f void 但由於後兩個不能轉換為void 編譯出錯。void 是可以指向任何型別的指標。c 中,只有int 0可以轉換為指標型,其餘均不可以,所以出...
C 子類和父類同名成員變數或函式
在c 中子類和父類同名成員時候c 版本不同處理的方式也不同。下面是我使用visual c 2015 update 3的測試結果 測試 如下 include using namespace std class base virtual void print base class public base...
PHP 類繼承 子類和父類同名方法會覆蓋
子類可以訪問父類的成員,繼承關鍵字extends,可以 的重用性,子類中寫了乙個與父類同名的方法,這個方法會覆蓋父類中的方法.1 重用性 2 擴充套件性 3 靈活性 類繼承 person.class.php class person public function say public functi...