对于非描述性标题感到抱歉,但我现在正在努力处理单词。我会跳进去看看:
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一样 - 它可能比另一种更好(如果有的话)。但是,如果你有任何非明显的原因,它可能是不好,我当然很感兴趣。
答案 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)
我很确定这不合法,但它是否可移植?
便携的唯一方法是合法。除非“便携式”,否则你的意思是在一小组类似系统之间移植。