2011-11-25 18 views
2

这里的一些代码:使用reinterpret_cast的成员函数的参数

class containerA 
{}; 

class containerB 
: public containerA 
{ 
    public: 
     containerB() {}; 

     containerB(const containerB& cb) 
     { 
      cout << "containerB copy ctor" << endl; 
     } 
}; 

class containerC 
: public containerA 
{ 
    public: 
     containerC() {}; 

     containerC(const containerC& cc) 
     { 
      cout << "containerC copy ctor" << endl; 
     } 
}; 

class myType 
{ 
    public: 

     void someFunction(const containerB& cB) 
     { 
      cout << "someFunction(containerB)" << endl; 
     } 
}; 

如果你认为上面的定义不能改变的,通过什么样的机制,才有可能调用的myType的“someFunction”方法与参数类型为“const containerC &”?

所有我能找到的公开从派生的myType一个新的类型,并重新定义了“someFunction”使用的reinterpret_cast如下:

class myTypeNew 
: public myType 
{ 
    public: 
     void someFunction(const containerC& cC) 
     { 
      cout << "someFunction(containerC)" << endl; 

      const containerB& cbRef = reinterpret_cast<const containerB&>(cC); 

      myType::someFunction(cbRef); 
     } 
}; 

这安全吗?我的猜测是,它将取决于containerB和containerC的操作符关于它们在某些函数中的使用方式。

所有容器都是模板化的,但这没什么区别,这是一个继承层次结构问题。

非常重要:由于显式类型转换是为containerB和containerC定义的,因此将containerA作为参数,我可以将containerC作为直接参数传递给myType :: someFunction,但在这种情况下,复制构造发生,这正是我想要避免的。

一些具体说明:既containerB和containerC的

  • 属性是完全相同的
  • someFunction仅利用opearator []用于访问容器的元件,并且
  • 操作者+ =(但此被定义在模板元素级别)

containerB和containerC不是两个通用的不同类型:containerC只是一些添加的成员函数,没有int对象的外部数据被改变。

回答

2

不,这是不安全的,我会认为它是在未定义的行为范围内。

类containerB和containerC是两个不同的类型(除了它们都从containerA继承)。

所以,唯一的 “合法” 的方式与A一起调用someFunction()用于containerB和containerC将

  • 提供someFunction过载覆盖类型
  • 提供一个someFunction(containerA & CA)基类containerA内足够接口
+0

重载已经超越了我的想法,但有没有一种安全的方式来使用someFunction(containerB)已经定义的代码? – tmaric

+2

如果containerC和containerB具有共同的功能,则应该由containerA中的实现(B和C继承)中的实现来表示,然后可以由一个采用containerA的someFunction来覆盖。如果没有共同的功能,你必须有两个不同的实现。其他一切都很糟糕。 –

2

这是不安全的。

someFunction可能会调用是ContainerB(否则,它可能有ContainerA作为它的参数类型)部分的方法。

如果该方法被调用的对象不是一个ContainerB(因为它是ContainerC,你只是类型强制转换的话),可能会发生故障(如试图访问不存在的成员变量)。

+0

有containerB和containerC之间没有什么不同的成员变量,someFunction调用operator []的和元素(不依赖于这个问题进行算术) – tmaric

+0

有没有一种方法可以从someFunction(containerB)获取功能而不用重写代码?这两个容器的代码完全一样,完全相同。 – tmaric

1

它通常是不可靠的

  • containerBcontainerA
  • containerCcontainerA

由于公有继承的定义,但

  • containerB不是一个containerC

所以你不能从一种类型转换到另一种类型。

也许可以考虑写一个函数FromCtoB(...)这个函数将给定的containerC所需的元素复制到一个新的containerB
注意,这将是可能只有在情况下,相关数据没有声明private

相关问题