不能将兄弟方法与虚拟继承cpp一起使用

时间:2016-11-16 12:36:14

标签: c++ inheritance

  

由于虚拟继承,当write()函数来自   调用发送器类,方法read()来自接收器类   被调用(你可能已经注意到,发射器类没有   有一个read()函数)。在上面的层次结构中,我们可以实例化   只有收音机类,因为发射器和接收器是抽象的   到虚拟继承。   http://www.cprogramming.com/tutorial/virtual_inheritance.html

所以我尝试了它并没有为我工作。

#pragma once
#include <iostream>
using namespace std;
父亲班:

class father
{
public:
    father(){

    };
    ~father(){};

    virtual void printt() = 0;

    void sett()
    {
        printt();
    }
    void father()
    {
        cout << "Im your father...";
    }
private:
};

人:

#pragma once
#include <iostream>
using namespace std;
#include "father.h"

class MyClasst: public virtual father
{
public:
    MyClasst(){
        g = 8;
    };
    ~MyClasst(){};

    void print()
    {
        cout << "a";
    }
    void c()
    {
        cout << "bbb";
    }
private:
 ...
};

学生班:

#pragma once
#include <iostream>
#include "father.h"
using namespace std;


class MyClassa: public virtual father
{
public:
    MyClassa(){

    };
    ~MyClassa(){};

    void printt()
    {
        cout << "b";
    }
    void b()
    {
        c();
        printt();
    }
private:
...
};

根据上述规则,我应该能够在'b()'('b()'中的人类中调用'c()'是Student的函数,它是'Person class'的虚拟兄弟。 但是我收到了一个错误:

  

错误1错误C3861:'c':标识符不是   找到了c:\ users \ micha \ onedrive \מסמכים\ visual studio   2013 \ projects \ project7 \ project7 \ student.h 21 1 Project7

2 个答案:

答案 0 :(得分:0)

这是因为“c()”函数未在基类“father”中声明,而您的班级“MyClassa”仅来自“father”。 因此,类“MyClassa”的对象将不包含任何函数“c()”。 派生自“MyClasst”的类的对象(以及从“MyClassa”和“MyClasst”派生的对象都将拥有它。 如果要编译代码,必须在父类中添加“c()”声明。在“virtual void c() = 0;”类中添加“father”行 - 然后将编译。这里的实例:http://rextester.com/OBBC17077

答案 1 :(得分:0)

c()中没有方法MyClassa直接或father继承。 c()中有一个方法MyClasst,但这两个类除了继承father之外没有任何关系,但这并不允许它们相互调用方法。

Imho与所谓的#34;父母班级的比喻&#34;和#34;儿童班&#34;没有多大意义,只会导致混乱。说&#34;孩子是父母&#34;是没有意义的,但那就是(公共)继承实际上是什么。我建议你忘记“兄弟班”这个词#34;它不会帮助你理解任何东西。而且你得到的错误与virtual继承没什么关系。使用public继承会得到相同的错误。