C++,如何将派生类转换为 protected 基类?

标签 c++ inheritance casting base-class class-visibility

我需要将一个类强制转换为其 protected 基类:

class ComplicatedOne : public Object {
    //Lots of funcs I don't want or need.
};

class Line : protected ComplicatedOne {
    //Some funcs of ComplicatedOne get re-implemented or called by alias here
};

class Array {
    void Add (Object &obj);
};

main() {
    Array a;
    a.Add(new Line());
}

我需要将 Line 添加到 ArrayObject 基不可见。我应该公开地重新实现它的方法,还是有一个我可以覆盖的隐式转换运算符?

最佳答案

有了这个,您就告诉编译器您不能将 Line 隐式转换为 Object:

class Line : protected Object {
};

但在我看来,你想这样做,而且你应该这样做。所以把遗产公之于众。这是一个设计问题。

不要为了让基类中的方法protected而使继承protected

另一种选择是在行中实现转换运算符:

class Line : protected Object 
{
public:
   operator Object&();
};

然后像这样调用函数:

a.Add(Line());

代替

a.Add(new Line());

在这种情况下,您不能隐式转换指针。但是我建议更改继承类型。

关于C++,如何将派生类转换为 protected 基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8558998/

相关文章:

vba - Excel VBA : how to cast a control got from the UserForm's Controls collection to its native ActiveX type?

c++ - 从 C++ 中的 .csv 文件中读取 double

.net - (Iron)Python继承构造函数问题

c++ - 使c++不等待用户输入

c++ - 多个基类可以有相同的虚方法吗?

构建 Java 程序帮助中的 Java 继承示例 - 找不到符号

c++ - 指向模板聚合类型的指针上的reinterpret_cast 的安全性

c - c中的自动类型转换(或不?)

c++ - 我们是否需要在嵌套类型的成员参数前加上 "::"前缀?

c++ - 如何用 Qt 插入空值?