#include <iostream>
using namespace std;
class A
{
public:
virtual void testfunc() const{ cout << "A" << endl; }
protected:
private:
int i;
};
class B :public A
{
public:
void testfunc() const { cout << "B" << endl; }
};
class C :public B
{
public:
void testfunc() { cout << "C1" << endl; }
void testfunc() const{ cout << "C" << endl; }
};
int main()
{
C c;
A &pa = c;
C &pc = c;
pa.testfunc();
pc.testfunc();
getchar();
}
為什么pc.testfunc()輸出的是c1,C object 的布局應該是
吧uj5u.com熱心網友回復:
void testfunc() constconst常函式,當物件是常物件時才呼叫常函式。
uj5u.com熱心網友回復:
常成員函式,理解錯誤,應該是同名函式覆寫,沒有多型時先呼叫非虛擬函式。
uj5u.com熱心網友回復:
前面還是理解錯誤,應該是多載函式非const物件默認呼叫非const成員函式。(常物件只能呼叫常成員函式)http://blog.csdn.net/u014630623/article/details/51290954
#include <iostream>
using namespace std;
class A
{
public:
virtual void testfunc() { cout << "A" << endl; }
protected:
private:
int i;
};
class B :public A
{
public:
void testfunc() { cout << "B" << endl; }
};
class C :public B
{
public:
void testfunc() const { cout << "C1" << endl; }
void testfunc() { cout << "C" << endl; }
};
int main()
{
C c;
A &pa = c;
C &pc = c;
pa.testfunc();
pc.testfunc();
getchar();
return 0;
}
結果:
C
C
uj5u.com熱心網友回復:
我把重點放在了virtual和non-virtual的呼叫上而忽略了const,感謝你的回答。現在感覺我的問題是有些問題的,我想問的是vtbl的函式和non-virtual函式重名時的情況會呼叫那個,并且不只重名而且引數串列也是一樣的,只是一個是virtual,一個non-virtual。例如這樣:
class A
{
public:
virtual void testfunc() { cout << "A" << endl; }
private:
int i;
};
class B :public A
{
public:
void testfunc() { cout << "B" << endl; }
};
class C :public B
{
public:
void testfunc() { cout << "C" << endl; }
int testfunc() {cout << "C" << endl; return 1;}
};
但寫完發現不對,因為不允許多載只是return值不同的函式,也就是說c++的多載機制已經避免發生了我所描述的情況。如果說非要重名且引數串列一致,有加const之類的方法,這個時候在選擇呼叫誰的時候會有其他附加的條件,比如說是否是const物件。
uj5u.com熱心網友回復:
多載決議是編譯時進行的虛函式是運行時的
void testfunc() { cout << "C" << endl; }
int testfunc() {cout << "C" << endl; return 1;}
這個不是多載,會直接編譯錯誤。
uj5u.com熱心網友回復:
我的意思就是這個 多載不允許這種情況發生
uj5u.com熱心網友回復:
而且雖然虛函式機制屬于運行期多型,但是虛函式表(vtbl)是在編譯期就決定的,運行時是決定用哪個虛指標(vptr)吧。
uj5u.com熱心網友回復:
從設計角度講,最好不要重名。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/67656.html
標籤:基礎類
上一篇:C++和資料結構
