c ++自动'类型转换'转换

时间:2014-02-18 06:31:32

标签: c++ types casting

有人可以解释为什么下面的代码不能在错误时编译:

Error   1   error C2243: 'type cast' : conversion from 'Der *' to 'Base *' exists, but is inaccessible  d:\users\lzizva\documents\mta\c++\projects\temp1\17022014.cpp   50  1   temp1
Error   2   error C2243: 'type cast' : conversion from 'Der *' to 'Base *' exists, but is inaccessible  d:\users\lzizva\documents\mta\c++\projects\temp1\17022014.cpp   51  1   temp1
    3   IntelliSense: conversion to inaccessible base class "Base" is not allowed   d:\users\lzizva\documents\mta\c++\projects\temp1\17022014.cpp   50  12  temp1
    4   IntelliSense: conversion to inaccessible base class "Base" is not allowed   d:\users\lzizva\documents\mta\c++\projects\temp1\17022014.cpp   51  14  temp1

我认为当有私有继承时,子进程获取所有属性和方法并将它们设置为私有,它只会影响子进程的子类。 我在这里错过了什么? 编译器实际上做了什么?

提前致谢, Liron

#include <iostream>

using namespace std;

class Base
{
int n;
Base* next;
public:
Base(int n, Base* next = NULL) : n(n), next(next)
{}

virtual void print() const
{
cout << n << endl;

if (next != NULL)
{
next->print();
}
}

virtual ~Base()
{
cout << "Base" << endl;
}
};

class Der : private Base
{
int counter;
public:
Der(int n, Base* next = NULL) : Base(n, next), counter(n){}

void print() const
{
cout << counter << endl;
Base::print();
}

~Der()
{
cout << "Der" << endl;
}
};

void main()
{
Der one(1);
Der two(2, &one);
Der three(3, &two);

three.print();
}

2 个答案:

答案 0 :(得分:5)

问题在于构建twothreeDer构造函数需要Base*,但您传递Der*指针。

由于Der私下来自BaseDer - &gt; Base无法访问main()转换,因此错误。

答案 1 :(得分:3)

尽管基类和派生类型之间存在紧密耦合,但私有继承是“has-a”关系,而不是“is-a”。它确实适用于继承实现,而不是接口,并且,正如您所发现的,它不能用于多态,因为对基类型的引用或指针不能绑定到派生类型的实例。

进行此次通话时

Der two(2, &one);

您正试图将&oneDerived*绑定到Base*

有关私有继承的更多信息,请参阅uses and abuses of inheritance GOTW