-4

私を助けてください。私は本当にポリモーフィズムが得意ではありません。私は一方を他方から継承したクラスをしなければなりません。

編集:申し訳ありませんが、完全に私の間違い。私でさえ問題を見つけるために約2時間を過ぎました。興味のある方(助けてくれてありがとう)

if (type.compare("TEST1") == 0) result = new Test(ID, database);
if (type.compare("TEST2") == 0) result = new Test(ID, database);
if (type.compare("TOR") == 0) result = new Tor(ID, database);

「==0」は完全に欠落していました。

class A {
public:
    void go() {do();}
    virtual void do() {printf('A');}
}

class B:public A {
    virtual void do() {printf('B');}
}

int main {
    A* obj = new B();
    obj->go();
}

結果は「B」ではなく「A」になります。どうすれば「B」にすることができますか?

ありがとう。

4

2 に答える 2

5

コードはそのままではコンパイルされませんが、いくつかの変更を加えた後、目的の結果が得られたようです。

#include <cstdio>

class A {
public:
    void go() 
    {
       do1();
       };
    virtual void do1() {printf("a");}
};

class B:public A {
    virtual void do1() {printf("b");}
};

int main() {
    A* obj = new B;
    obj->go();
}

まず第一にdo予約語であり、main適切に宣言されておらずprintf、:を取りchar *ます

int printf(const char *format, ...);

charしたがって、からへの無効な変換を行おうとしていましたchar *

于 2013-03-26T18:38:34.967 に答える
-1

コンパイルするためにいくつかのことを片付けた後:

#include <stdio.h>

class A {
public:
    virtual void DO() {printf("A");}
    void go() {DO();}
};

class B:public A {
    virtual void DO() {printf("B");}
};

int main() {
    A* obj = new B();
    obj->go();
    return 0;
}

doはキーワードでprintfあり、charではなくchar *を取り、main角かっこが必要で、整数を返します)

私が設定した最適化レベルに関係なく、それは常にB私のために生成されました:

$ g++ inherit.cpp -o inherit && ./inherit
B
$ g++ inherit.cpp -O1 -o inherit && ./inherit
B
$ g++ inherit.cpp -O2 -o inherit && ./inherit
B
$ g++ inherit.cpp -O3 -o inherit && ./inherit
B
$ g++ inherit.cpp -O4 -o inherit && ./inherit
B
$ g++ inherit.cpp -O5 -o inherit && ./inherit
B

ただし、コンパイラでエッジケースに遭遇した可能性があります。これにより、do()insideへの呼び出しがインライン化されることになりましgo()た。

于 2013-03-26T18:46:42.597 に答える