c – 多重继承:2Classes1Method

前端之家收集整理的这篇文章主要介绍了c – 多重继承:2Classes1Method前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我刚刚尝试过这段代码
struct FaceOfPast
{
    virtual void Smile() = 0;
};

struct FaceOfFuture
{
    virtual void Smile() = 0;
};

struct Janus : public FaceOfPast,public FaceOfFuture
{
    virtual void Smile() {printf(":) ");}
};

void main()
{
    Janus* j = new Janus();
    FaceOfFuture* future = j;
    FaceOfPast* past = j;

    future->Smile();
    past->Smile();

    delete j;
}

它的工作原理(输出两个笑脸),但我不认为它甚至应该编译,重新声明Smile()在Janus是不明确的.

如何(和为什么)它的工作?

解决方法

没有歧义,因为你调用Smile()指向FaceOfFuture和FaceOfPast,只声明一个方法Smile().

因为在基类指针上调用方法不能导致歧义,所以我们直接在子类指针上调用方法来处理这种情况:

Janus* j = new Janus();
j->Smile();

派生类除了重写之外,还隐藏了基类的声明Smile().只有当您不会覆盖派生类中的方法时,您才会有歧义:

以下编译:

struct FaceOfPast
{
    virtual void Smile() {printf(":) ");}
};
struct FaceOfFuture
{
    virtual void Smile() {printf(":) ");}
};
struct Janus : public FaceOfPast,public FaceOfFuture
{
   virtual void Smile() {printf(":) ");}
};
int main()
{
   Janus* j = new Janus();
   j->Smile();
}

虽然您在Janus上调用Smile,但是基类声明是隐藏的.

以下不是:

struct FaceOfPast
{
    virtual void Smile() {printf(":) ");}
};

struct FaceOfFuture
{
    virtual void Smile() {printf(":) ");}
};

struct Janus : public FaceOfPast,public FaceOfFuture
{
};

int main()
{
   Janus* j = new Janus();
   j->Smile();
}

由于含糊不清

猜你在找的C&C++相关文章