我的节目是:-
#include < iostream.h>
#include < conio.h>
struct base
{
protected:
void get()
{
cin>>a>>b;
}
public:
base(int i=0, int j=0);
void put()
{
cout << a << '\t' << b << "\tput 1";
}
int a,b,c;
~base()
{
cout << "base destroyed";
}
};
class deri : protected base
{
int c,d;
char w;
int ans;
public:
deri(int r=7, int s=0)
: base(r,s)
{
c=r;
d=s;
cout << "\nDerived invoked\n";
}
void put()
{
cout << c << '\t' << d << '\t' << a << '\t' << b;
}
};
class d2 : protected deri
{
public:
d2() {}
void start();
void add()
{
get(); // ERROR HERE: Implicit conversion of 'd2 *' to 'base *' not allowed
}
~d2(){}
};
void d2::start()
{
put();
}
base::base(int i, int j)
{
a=i;
b=j;
cout << "\nbase invoked\n";
cout << "Enter a,b: ";
get();
}
void main()
{
clrscr();
getch();
}有人能解释一下错误信息是什么意思吗?
发布于 2010-01-27 13:28:10
您可能正在使用旧的编译器,因为您包含的是<iostream.h>,而不是新的标准<iostream>,而且您没有使用命名空间std.
修复后,将行using namespace std;添加到顶部,并注释掉clrscr(),您的代码在MSVC8上编译得很好。
您有明确的理由使用protected删除吗?如果没有,我建议使用public删除。protected删除是非常复杂和不常见的事情。
发布于 2010-01-27 13:29:45
当您使用受保护或私有派生基类时,派生类不会被视为基类,在这种情况下,编译器将不会执行隐式类型转换。
在私有继承或受保护继承的情况下,派生类在非基类中。而在公共继承的情况下,每个派生类都是一个基类。
在函数中尝试显式类型转换,或者使继承公开。
https://stackoverflow.com/questions/2147077
复制相似问题