2012-08-06 102 views
2
class Foo 
{ 
    public: 
     void action(); 
}; 

class Bar : public Foo 
{ 
    public: 
     void action(); 
}; 

void Foo::action() 
{ 
    cout << "parent\n"; 
}; 

void Bar::action() 
{ 
    cout << "child\n"; 
}; 



int main() 
{ 
    Foo* foo = new Bar(); 
    foo->action();   // returns "parent" - "child" expected 

    return 1; 
} 

我是一個平凡的可能問題,對不起,我是新來的C++ ... 的「富」指針必須指向Foo類的實例,因爲它可以是Foo的任何孩子,例如Bar,Bar1,Bar2,Bar3等C++重寫在子類函數成員

而且'foo-> action()'應該運行子類的重載函數。 請告訴我,我該如何更正代碼才能達到我的目標...... 謝謝!

回答

2

不同於其它語言,如Java,C++中的基類具有特異性標記使用關鍵字可以覆蓋的方法virtual

+0

Большоеспасибо,Роман:) – Kolyunya 2012-08-06 10:14:03

+0

Незачто,Колюня – 2012-08-06 10:30:22

2

使用關鍵字virtual作爲父級功能。而且,你的父母班應該有virtual destructor

class Foo 
{ 
    public: 
     virtual void action(); 
}; 

class Bar : public Foo 
{ 
    public: 
     void action(); 
}; 

void Foo::action() 
{ 
    cout << "parent\n"; 
}; 

void Bar::action() 
{ 
    cout << "child\n"; 
}; 



int main() 
{ 
    Foo* foo = new Bar(); 
    foo->action();   // returns "parent" - "child" expected 

    return 1; 
} 
+0

我非常感謝您ForEveR的答案。 – Kolyunya 2012-08-06 10:20:24

+1

@Kolyunya因爲當你調用delete foo(你應該調用它)時,如果Foo d-tor不是虛擬的 - 它將被調用並且Bar d-tor不會被調用,那是不正確的。 – ForEveR 2012-08-06 10:29:47

+0

@ForEveR:嚴格地說這是未定義的行爲。你可能會發現錯誤的析構函數被調用,你可能會發現你的程序崩潰了。無論如何,都需要虛擬析構函數。 – john 2012-08-06 10:31:21

2

成員函數需要聲明virtual(Java不同例如,其中所有的方法都是隱式virtual):

class Foo 
{ 
public: 
    virtual void action(); 
}; 
+0

非常感謝你的回答。 – Kolyunya 2012-08-06 10:19:09