【问题标题】:pClass1 = (Class1*)pBase->next without (Class1*) castpClass1 = (Class1*)pBase->next 没有 (Class1*) 演员表
【发布时间】:2010-02-18 10:21:13
【问题描述】:

类基础 { 下一个基*; }

class Class1 : Base
{
}

Base* pBase = new Base();
Class1* pTest = new Class1();
pBase->next = pTest;

Class1* pClass1;
pClass1 = (Class1*)pBase->next;

我希望能够写作

pClass1 = pBase->next;

并且没有编译错误 C2440(无法转换)。或者换句话说,我希望 pClass1 指向 pBase->next 指向的类。

是否有可能通过一些运算符重载?怎么做?

【问题讨论】:

  • 为什么不使用“Base* pClass1;”?

标签: c++ visual-studio-2008 inheritance operator-overloading


【解决方案1】:
template<class T>
class Base 
{ 
   T* next; 
} 

class Class1 : Base<Class1> 
{ 
} 

Class1* pTest1 = new Class1(); 
Class1* pTest2 = new Class1(); 
pTest1->next = pTest2;

Class1* pClass1; 
pClass1 = pTest1->next; 

【讨论】:

【解决方案2】:

如果 - 在开发时 - 您确定 next 指向 Class1 的实例,请将 next 设为 Class1 指针而不是 Base 指针。

如果您不确定,并且您只在编译时知道,您必须使用动态转换(可能 next 稍后将指向 Class2 实例)。

【讨论】:

  • 第二种情况是从基类派生的 Class2 或更多。在这种情况下如何使用动态转换?
  • pClass1 = dynamic_cast(pBase->next); if (!pClass1) std::cout
  • 不是,我想要的。 pClass1 = dynamic_cast>(pBase->next);比 pClass1 = (Class1)pBase->next 还要长;我想要简单的 pClass1 = pTest1->next;
  • 是的,但是动态转换是安全的,以防您最终得到一个也继承自 Base 的 Class2。您在此处使用的 C 类型转换实际上是 C++ 中的静态转换。如果您 100% 确定 Base->Next 指向 Class1 实例,那么它会更快。但是,如果您不能确定这一点,那么使用静态转换就是自找麻烦。
  • 哦,好的。所以你说 (Class1*) 实际上是 static_cast?对不起我的无知。
【解决方案3】:

我能得到的最接近你所追求的是:

class Class1;

class Base
{
public:
    Base* next;

    operator Class1*()
    {
        return (Class1*)this;
    }
};

class Class1 : public Base
{
};

和:

Base* pBase = new Base();
Class1* pTest = new Class1();
pBase->next     = pTest;

Class1* pClass1;
pClass1 = *pBase->next;

但是,这确实与 C++ 搞混了,您以后会为此付出高昂的代价。只需使用 Patrick 提到的其中一种演员表。

【讨论】:

  • 好,但是我不希望Base类直接引用Class1,因为它可以是继承Base的Class2、Class3。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多