隐式转换

时间:2010-01-27 13:21:43

标签: c++ implicit-cast

我的节目是: -


#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();

}

任何人都可以解释错误信息的含义吗?

2 个答案:

答案 0 :(得分:1)

您可能正在使用旧的编译器,因为您包含<iostream.h>而不是新标准<iostream>,并且您没有使用命名空间std.
修复此问题后,在顶部添加行using namespace std;并注释掉clrscr(),您的代码在MSVC8上编译正常。

你有明确的理由使用protected衍生物吗?如果没有,我建议使用public代替。 protected衍生是非常复杂和罕见的事情。

答案 1 :(得分:0)

使用protected或private派生基类时,派生类不会被视为基类,在这种情况下编译器不会执行隐式类型转换。

在私有或受保护继承的情况下,非基类中的派生类。 而在公共继承的情况下,每个派生类都是基类。

在函数中尝试显式类型转换或将继承公开。