7

以下のようなコードを持っています

// A has a virtual function F().
class A
{
public:
    virtual void F() {};
};

// The same for B.
class B
{
public:
    virtual void F() {};
};

// C inherits A and B.
class C : public A, public B
{
public:
    // How to implement the 2 virtual functions with the same name but from
    // different base classes.
    virtual F() {...}
};

基本クラスには F() のデフォルトの実装があることに注意してください。

Jan Herrmann と Spook に感謝します。追加のヘルパーを使用する必要がある場合、以下はより簡単な解決策ですか?

#include <iostream>

// A has a virtual function F().
class A
{
private:
    virtual void A_F() {}

public:
    void F() {return A_F();};
};

// The same for B.
class B
{
private:
    virtual void B_F() {}

public:
    void F() {return B_F();};
};

// C inherits A and B.
class C : public A, public B
{
private:
    virtual void A_F() {std::cout << "for A\n";}
    virtual void B_F() {std::cout << "for B\n";}

};

int main()
{
    C c;
    c.A::F();
    c.B::F();
    return 0;
}
4

2 に答える 2

5
class C_a 
  : public A
{
  virtual void F_A() = 0;
  virtual void F() { this->F_A() };
};

class C_b
  : public B
{
  virtual void F_B() = 0;
  virtual void F() { this->F_B() };
};

class C
  : public C_a
  , public C_b
{
  void F_A() { ... }
  void F_B() { ... }
};

私の記憶が正しければ、ISO 委員会はこの問題について考え、言語の変更について議論しました。しかし、その後...誰かがこの問題を解決するこの素晴らしい方法を見つけました:-)

クラス階層を変更できる場合は、2番目のソリューションの方が適しています。http://www.gotw.ca/publications/mill18.htmでロックがかかる場合があります。なぜそれが優れているのかを説明しています。

于 2013-02-07T15:25:55.587 に答える
2

これを試して:

#include <cstdio>

class A
{
public:
    virtual void F() = 0;
};

class B
{
public:
    virtual void F() = 0;
};

class C : public A, public B
{
    void A::F()
    {
        printf("A::F called!\n");
    }

    void B::F()
    {
        printf("B::F called!\n");
    }
};

int main(int argc, char * argv[])
{
    C c;
    ((A*)(&c))->F();
    ((B*)(&c))->F();

    getchar();

    return 0;
}

ただし、C のインスタンスから F を呼び出すことはできません (あいまいな呼び出し)。

また、FA と B で抽象化する必要があります。そうしないと、コンパイル エラーが発生します。

Error 1 error C3240: 'F' : must be a non-overloaded abstract member function of 'A'
于 2013-02-07T15:18:01.270 に答える