C 子類函式對父類同名函式的覆蓋

2021-06-16 22:49:53 字數 2357 閱讀 4617

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...