[英]Abstract class and inheritance
class MyInterface {
public:
virtual void someFunction()= 0;
};
class X: public MyInterface {
private:
virtual void doThis() {
printf("This X");
}
virtual void doThat() {
printf("That X");
}
public:
void someFunction() {
doThis();
doThat();
}
};
class Y: public MyInterface, private X {
private:
void doThat() {
printf("That Y");
}
};
MyInterface *iface= new Y();
Y->someFunction();
來自Java
的OOP風格,我試圖將頭圍在C ++的OOP模型上。 我已閱讀: http : //www.gotw.ca/publications/mill18.htm,以獲取有關如何在C ++中設計接口的建議。 上面的代碼是作者闡述的規則的直接應用(或其微小變化)。 我的問題是,上面的代碼是否會產生“ This X”和“ That Y”? 我感到困惑的是,作者建議結合使用virtual
和private
。 我的推論是,如果一個函數是private
,那么我們該如何覆蓋它呢? 在上面的代碼中,由於我們是從接口公開派生的,因此可以將Y
用作賦值的右側。 當我們在其上調用someFunction()
時,由於我們沒有在class Y
內顯式提供任何實現,它將使用class X
的實現嗎? 然后,如果有的話,它會查看doThat()
並再次使用Y
的實現?
該代碼有一些問題。 這是一個工作示例:
class MyInterface
{
public:
virtual ~MyInterface() { }
virtual void someFunction() = 0;
};
class X : public MyInterface
{
private:
virtual void doThis()
{
printf("This X\n");
}
virtual void doThat()
{
printf("That X\n");
}
public:
void someFunction()
{
doThis();
doThat();
}
};
class Y : public X
{
private:
void doThat()
{
printf("That Y\n");
}
};
int main()
{
MyInterface *iface = new Y();
iface->someFunction();
delete iface;
}
您需要使用class Y : public X
才能使用void X::someFunction()
的實現。
不幸的是,C ++中沒有真正的接口,只有使用純虛擬類的解決方法。 有兩個父母的解決方法有其自身的局限性(請參見下面的內容) 。 因此,在接口定義中添加析構函數也是一個好主意。
當使用class Y: public MyInterface, private X
您需要提供MyInterface::someFunction()
的自定義實現。 您在兩個父級( X
和MyInterface
)中都有兩個父類和someFunction()
) 。 即使只有一種功能實現,這也是必要的。 因此,您需要指定將使用哪個父類“實現”。 錯誤:
'Y':無法實例化抽象類
刪除接口(嘗試從X
使用接口)時,也會出現錯誤。 原因很簡單,當X
為私有時,實現不是公開的,不能用作接口。
'類型轉換':存在從'Y *'到'MyInterface *'的轉換,但是無法訪問
您正在使用類作為Y->someFunction();
我不知道為什么您可以覆蓋私有虛擬功能。 我現在主要在C#中工作,而C ++的這一“功能”是我無法理解的。 沒錯,這應該是錯誤的代碼,但它可以正常工作(至少在Visual Studio 2017中) 。
我也想知道,為什么這不被認為是錯誤/不正確的代碼構造。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.