2017-05-23 15 views
0

以下のコードの派生クラスTest2とTest3は仮想型ではありません。なぜ関数がオーバーライドされ、どうしてそれが起こらないようにするのですか? P.S - >私は初心者ですので質問は愚かかもしれません。多値継承の多形

#include <iostream> 
using namespace std; 

class Test { 
public: 
    int a, b, c; 
    Test(int x, int y, int z) { 
    a = x; 
    b = y; 
    c = z; 
    } 
    void print() { cout << "a= " << a << "b= " << b << "c= " << c << endl; } 
}; 

class Test2 : public Test { 
public: 
    int d, e; 
    Test2(int a, int b, int c, int x, int y) : Test(a, b, c) { 
    d = x; 
    e = y; 
    } 
    virtual void print() { cout << "d= " << d << "e= " << e << endl; } 
}; 

class Test3 : public Test2 { 
public: 
    int f; 
    Test3(int a, int b, int c, int d, int e, int x) : Test2(a, b, c, d, e) { 
    f = x; 
    } 
    void print() { cout << "f= " << f << endl; } 
}; 

class Test4 : public Test3 { 
public: 
    int g; 
    Test4(int a, int b, int c, int d, int e, int f, int x) 
     : Test3(a, b, c, d, e, f) { 
    g = x; 
    } 
    void print() { cout << "g= " << g << endl; } 
}; 

int main() { 
    Test *test; 
    Test2 *test2; 
    Test3 *test3; 
    Test4 test4(1, 2, 3, 4, 5, 6, 7); 
    test = &test4; 
    test2 = &test4; 
    test3 = &test4; 
    test->print(); 
    test2->print(); 
    test3->print(); 
    test4.print(); 
    return 0; 
} 
+2

はあなたが行動は、あなたが期待しているラインにいたものとどのように異なるかを説明することはできますか? –

+3

'Test2 :: print' *は' Test :: print'を隠して( 'virtual'に再宣言します)、' Test2'のすべての子は 'virtual'として関数を継承します。 – UnholySheep

+0

@UnholySheep印刷にアクセスできないTest2から直接または間接的に派生したクラスのどれですか? –

答えて

1

Test2::printvirtualであり、したがってTest2へのポインタでprintへのコール又は呼び出しするように機能するかを決定するために、オブジェクトの実行時の型を使用するTest2から派生するクラスへのポインタ。あなたの場合、オブジェクトの実行時の型はTest4なので、Test4::printを呼び出します。それはvirtualのポイントです。

あなたは明示的にあなたがそうすることができprintの異なるバージョンを呼び出したい場合は、例えばtest3->Test3::print();