这是一些代码:

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;
        }
};

如果您假设上述定义无法更改,则可以通过哪些机制调用类型为“const containerC&”类型的myType的“someFunction”方法?

我所能找到的就是从myType公开派生一个新类型,并使用reinterpret_cast重新定义“someFunction”,如下所示:
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);
        }
};

这样安全吗?我的猜测是,关于如何在someFunction中使用它们,将取决于containerB和containerC的运算符。

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

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

一些特定的注意事项:

containerB和containerC的
  • 属性完全相同
  • someFunction仅使用opearator []访问容器元素,而
  • 运算符+ =(但这是在模板元素级别定义的)

  • containerB和containerC并不是两种通用的不同类型:containerC仅添加了一些成员函数,没有更改对象的内部数据。

    最佳答案

    不,这是不安全的,我认为这属于未定义行为的范围。

    类containerB和containerC总共是两种不同的类型(但它们都继承自containerA)。

    因此,为containerB和containerC调用someFunction()的唯一“合法”方法是

  • 提供一些覆盖
  • 类型的功能的重载
  • 在基类容器中提供someFunction(containerA&ca)以及足够的接口(interface)

    关于c++ - 使用reinterpret_cast作为成员函数参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8269648/

  • 10-12 00:26