由于虚拟继承,当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
答案 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
继承会得到相同的错误。