gpt4 book ai didi

c++ - 从嵌套结构继承 : templates and pointers

转载 作者:搜寻专家 更新时间:2023-10-31 01:56:20 25 4
gpt4 key购买 nike

我正在尝试向 C++ 中的嵌套结构添加一些额外的字段,并且设计表明我想通过继承来这样做。我收到一个错误,奇怪的是,该错误取决于我使用的是类型 T* 还是类型 T**。我很困惑,希望有人能帮助我了解这里发生的事情。

嵌套结构是 Base::Node,我想向 Base::Node 添加一个字段 b,然后使用 Derived,如 main 中所示。当我将顶部的 #define 设置为 0 时,一切都可以编译并正常工作。当我将 #define 更改为 1 时,出现以下编译器错误:

main_inhtest.cpp: In instantiation of ‘Derived<int>’:
main_inhtest.cpp:52: instantiated from here
main_inhtest.cpp:44: error: conflicting return type specified for ‘Derived<T>::DNode** Derived<T>::GetNAddr() [with T = int]’
main_inhtest.cpp:24: error: overriding ‘Base<T>::Node** Base<T>::GetNAddr() [with T = int]’
main_inhtest.cpp: In member function ‘Derived<T>::DNode** Derived<T>::GetNAddr() [with T = int]’:
main_inhtest.cpp:57: instantiated from here
main_inhtest.cpp:44: error: invalid static_cast from type ‘Base<int>::Node**’ to type ‘Derived<int>::DNode**’

谁能帮我理解一下

  1. 这样做是否正确,是否有更好的方法,以及

  2. 为什么编译器对 GetN() 方法而不是 GetNAddr() 方法满意?

谢谢!

#include <iostream>

#define TRY_GET_N_ADDR 1

template <typename T> class Base {
public:
Base() { n = new Node(); }

struct Node
{
T a;
};
virtual Node *GetN() { return n; }
virtual Node **GetNAddr() { return &n; }

Node *n;
};

template <typename T> class Derived : public Base<T> {
public:
Derived() { Base<T>::n = new DNode(); }

struct DNode : Base<T>::Node
{
T b;
};

// This method is fine
DNode *GetN() { return static_cast<DNode *>(Base<T>::GetN()); }

#if TRY_GET_N_ADDR
// Compiler error here
DNode **GetNAddr() { return static_cast<DNode **>(Base<T>::GetNAddr()); }
#endif
};

int main (int argc, const char * argv[]) {
Derived<int> d;

d.GetN()->a = 1;
d.GetN()->b = 2;

std::cout << d.GetN()->a << " " << d.GetN()->b << std::endl;
}

最佳答案

问题不在于嵌套结构或模板,而在于指向指针和继承的指针:

  • Base* 可以包含 Derived* 的实例,因此 Base* 可以向下转换为 Derived*。
  • Base** 不能包含 Derived** 的实例,因此不能向下转换为 Derived**。

如果 Base** 可以容纳 Derived 的数组,您可以执行以下操作:

Derived* pDerived;
Derived** ppDerived = &pDerived;
Base** ppBase = ppDerived; // not allowed in real world
*ppBase = new Base; // should be safe, right?
pDerived->derivedFunc(); // invoked on instance of Base!

最后一行会导致一些任意错误。因此,这种赋值是不允许的。

关于c++ - 从嵌套结构继承 : templates and pointers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7301327/

25 4 0