2017-02-13 6 views
1
#include <iostream> 
using namespace std; 
class A { 
private: 
    int nVal; 
public: 
    void Fun() 
    { 
     cout << "A::Fun" << endl; 
    } 
    void Do() 
    { 
     cout << "A::Do" << endl; 
    } 
}; 
class B :public A { 
public: 
    virtual void Do() 
    { 
     cout << "B::Do" << endl; 
    } 
}; 
class C :public B { 
public: 
    void Do() 
    { 
     cout << "C::Do" << endl; 
    } 
    void Fun() 
    { 
     cout << "C::Fun" << endl; 
    } 
}; 
void Call(B& p) 

{ 
    p.Fun(); p.Do(); 
} 
int main() { 
    C c; Call(c); 
    return 0; 
} 

に基礎クラス参照を発表については、出力はC++多型は、上記のコードでは、派生クラス

A::Fun 

C::Do 

あるしかし、私は理解することはできません。出力がない理由の関数呼び出し(B & P)において、基準pは

C::Fun 

C::Do 

派生クラスにAA基底クラス参照を発表し、異なる基底クラスであるCクラスからCを参照し、そうすべきです何か意味がありますか?

+1

基本クラスで仮想関数を作成する必要があります。 –

答えて

2

A::Funvirtualとマークされていないため、実行時にC::Funが見つかりません。あなたはそのようにマークする必要があります。

class A { 
private: 
    int nVal; 
public: 
    virtual void Fun() 
    { 
     cout << "A::Fun" << endl; 
    } 
// ... 

wandbox example


これはoverride specifierにコンパイル時のおかげでキャッチすることができ、エラーの偉大な例です。

class C :public B { 
public: 
    void Do() override 
    { 
     cout << "C::Do" << endl; 
    } 
    void Fun() override 
    { 
     cout << "C::Fun" << endl; 
    } 
}; 

印刷しますか:

error: 'void C::Fun()' marked 'override', but does not override 
    void Fun() override 
      ^~~ 

wandbox example

+0

ありがとう!私は前にクラスのリファレンスを本当に理解していないことが分かった。 「B&P」を実行すると、まずBを調べてからAを調べると、Aが楽しい()が見つかったが、それは仮想ではないことが分かった。それで、それはAのfun()を直接呼び出します。そうですか? – user7487638

関連する問題