2016-12-16 3 views
1

派生クラスB::display()C::display()を使用しますが、A::display()を使用します。派生クラス 'display()nameと一緒にidと表示するようにコードを変更するにはどうすればよいですか?事前に
感謝:)C++サブクラス関数を呼び出す方法

#include <iostream> 
#include <vector> 

using namespace std; 

class A 
{ 
protected : 
    int id; 
public: 
    A (int id = 0) : id(id) {} 
    virtual void display() { cout << id << endl; } 

}; 

class B : public A 
{ 
    string name; 
public: 
    B (int id = 0, string name = "-") : A(id), name(name) {} 
    void display() { cout << id << " " << name << endl; } 
}; 

class C : public A 
{ 
    string name; 
public: 
    C (int id = 0, string name = "-") : A(id), name(name) {} 
    void display() { cout << id << " " << name << endl; } 
}; 

int main() 
{ 
    vector< vector <A> > aa; 
    vector<A> bb ; 
    vector<A> cc ; 

    A *yy = new B(111, "Patrick"); 
    A *zz = new C(222, "Peter"); 
    bb.push_back(*yy); 
    cc.push_back(*zz); 

    aa.push_back(bb); 
    aa.push_back(cc); 

    for (int i = 0; i < aa[0].size(); i++) 
    { 
     aa[0][i].display(); 
     aa[1][i].display(); 
    } 
} 
+1

に変更して、あなたがベクトルにポインタを保存していないという問題を修正してください。ベクトルをこれに変更する場合:ベクトルが動作します。 –

+0

私はそれがスーパークラスで仮想であると宣言すると、サブクラスの関数は自動的に仮想になると思ったのですか? – Jess

+0

ええ、私はあなたのスーパークラスのディスプレイが仮想であることに気付かなかったのです。私は最初のコメントを編集しました。 –

答えて

2

あなたがベクトルのdeclartionある彼のあなたの問題は非ポインタ型のものであり、実行時に、あなたがサブクラスに「ポイント」を失っているとあなただけのスーパーに滞在クラス。 あなたがしなければならないすべては、そのように、ポインタ型へのあなたのベクトルのすべてを変更されています。ここ

vector<A*> bb; 
+0

@ジェス、これはスライスと呼ばれています。オブジェクト自体ではなくポインタを押し戻して格納するときに '*'を取り除くだけです。 – Collin

+0

@Daniel Kovachevあなたの助けに感謝します!私は問題を解決することができました:) – Jess

+0

あなたは歓迎です:) –

1

問題は、ポインタを使用する必要が動作するように継承ためにです。あなたのベクトルはvector<A>であり、vector<A*>ではありません。したがって、逆参照バージョンのyyとzzをプッシュバックすると、AとBのデータメンバーのコピーではなく、BとCのデータメンバーのコピーがプッシュバックされます。 BとCのサイズはAと異なり、Aオブジェクトの場所に収まるデータメンバーのコピーのみを行います。

http://www.learncpp.com/cpp-tutorial/125-the-virtual-table/

+0

@Jess私は現時点で考えることができる唯一の追加リンクは:https://www.tutorialspoint.com/cplusplus/cpp_inheritance.htm – Eddge

+0

ありがとう、ありがとう君は! – Jess

0

あなたは多型がポインタなしで動作するように期待することはできません。 あなたの主な部分を

vector< vector <A*> > aa; 
vector<A*> bb; 
vector<A*> cc; 

A* yy = new B(111, "Patrick"); 
A* zz = new C(222, "Peter"); 
bb.push_back(yy); 
cc.push_back(zz); 

aa.push_back(bb); 
aa.push_back(cc); 

for (int i = 0; i < aa[0].size(); i++) 
{ 
    aa[0][i]->display(); 
    aa[1][i]->display(); 
} 
関連する問題