这是合法/安全的C ++吗? (向下转换为相同大小的继承类)

时间:2012-02-03 14:57:31

标签: c++ oop inheritance

对于非描述性标题感到抱歉,但我现在正在努力处理单词。我会跳进去看看:

class A
{
public:

protected:
    int doSomething();
};

class B : public A
{
public:
    int doSomething() { return A::doSomething(); }
};

...

A *a = new A;
B *b = static_cast<B*>(a);

cout << b->doSomething();

值得注意的是,B继承A并且不添加任何数据成员或虚函数,并且不会覆盖任何虚函数。这意味着B的实例在内存中应该等同于A的实例,我假设。

基本上,这样安全吗?我很确定这不合法,但它是否可移植?依赖这样的事情会有什么潜在的后果吗? (除了正常的yadayada。)

显然这是不好的做法,但我看到它就像我看到扔掉const一样 - 它可能比另一种更好(如果有的话)。但是,如果你有任何非明显的原因,它可能是不好,我当然很感兴趣。

3 个答案:

答案 0 :(得分:2)

这段代码还不错,但它不会给你买任何东西。你可以做同样的事情,但通过做这样的事情提供灵活的构图。

class A
{
public:

protected:
    int doSomething();
};

template <class T> 
class B : public T
{
 ... 
}

然后在您的客户端代码中,您可以编写一个提供功能集的对象。借助vardic模板的包容性,您可以从消费者的角度通过编译来构建对象。

B<A> Ob; 

另请参阅CRTP模式。

答案 1 :(得分:1)

即使没有明显不好的事情发生,问题是,为什么你会被迫做这样的事情呢?

如果你只想要一个包装器,那么让A成为B的成员就更清晰了,让B将调用转发给A.

答案 2 :(得分:1)

  

我很确定这不合法,但它是否可移植?

便携的唯一方法是合法。除非“便携式”,否则你的意思是在一小组类似系统之间移植。