gpt4 book ai didi

c++ - 从内部类继承

转载 作者:行者123 更新时间:2023-12-01 15:10:32 25 4
gpt4 key购买 nike

我用C++实现了一个二进制搜索树,现在我正试图从它继承。

基础树:

#ifndef TREE_HPP
#define TREE_HPP

class tree {
public:
class node {
public:
virtual int foo() { return 1; }

node() = default;
virtual ~node() = default;
};
node* root;
tree() : root(new node) {}
virtual ~tree() { delete root; }
};

#endif

派生树:
#ifndef DERIVED_TREE_HPP
#define DERIVED_TREE_HPP

#include "tree.hpp"

class derivedTree : public tree {
public:
class derivedNode : public node {
public:
virtual int foo() { return 2; }
};
};
#endif

主要:
#include "derivedTree.hpp"
#include "tree.hpp"
#include <iostream>
using std::cout;

int main() {
tree t1;
derivedTree t2;
cout << "Hey! " << t1.root->foo() << "\n";
cout << "Hey! " << t2.root->foo() << "\n";
}

输出为:
Hey! 1
Hey! 1

我希望它是1和2。
我认为这是因为 root是指向基树的指针,因此称为 tree::foo()。如何从树继承,使其包含派生节点?

最佳答案

欢迎来到StackOverflow!

虚拟方法的作用是使您可以基于实例化的实际类而不是指针的类型来调用方法。

因此,在您的情况下,root->foo()会根据实际的类调用该方法,而不总是调用node实现。

但是要调用derivedNode实现,必须实例化它!现在,您的derivedTree使用的是tree的基本构造函数,该构造函数直接实例化node,因此derivedTreetree都将node对象作为root!

如其他答案中已显示的,要解决该问题,您可以向tree添加一个采用外部node指针的构造函数,并在derivedTree的构造函数中使用该构造函数,以使用root的指针初始化derivedTree

像这样:(runnable link)

class tree {
public:
class node {
public:
virtual int foo() { return 1; }

node() = default;
virtual ~node() = default;
};
node* root;
tree(): root(new node) {};
tree(node* d) : root(d) {}; // here we initialize the root pointer with a given pointer
virtual ~tree() { delete root; };
};

class derivedTree : public tree {
public:
class derivedNode : public node {
public:
virtual int foo() { return 2; }
};
derivedTree(): tree(new derivedNode) {}; // here we use the added constructor to create a derivedNode and set it as root
};

using std::cout;

int main() {
tree t1;
derivedTree t2;
cout << "Hey! " << t1.root->foo() << "\n";
cout << "Hey! " << t2.root->foo() << "\n";
}

请注意,不可能直接在派生构造函数中初始化 root,因为该语言允许仅将实际类的字段而不是派生字段放入初始化列表中,并且取决于编译器,您可能会冒内存泄漏的危险。

关于c++ - 从内部类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62424810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com