在C ++继承中,派生类如何禁用基类的某些元素(数据或函数)?

时间:2014-12-26 15:13:25

标签: c++ inheritance

例如,假设现在我们有两个类,Tree(基类)和BinaryTree(派生类)。类Tree具有数据子项和函数getChildren()。

class Tree {
public:
    vector<int> getChildren();
    ...
private:
    vector<int> children;
    ...
};

派生类具有leftChild和rightChild数据,以及getLeftChild()和getRightChild()函数。

class BinaryTree : public Tree {
public:
    int getLeftChild();
    int getRightChild();
    ...
private:
    int leftChild;
    int rightChild;
    ...
};

当然,数据子节点和函数getChildren()不是我们在派生类中想要的。我们可能根本就不使用它们但它们仍然存在。那么如何在派生类中禁用这些元素呢?

由于

5 个答案:

答案 0 :(得分:6)

您面临的主要问题是概念,而不是编程。

Tree中,您可以通过拨打getChildren()来接收孩子,并且您可以对BinaryTree使用相同的内容,区别在于BinaryTree::getChildren只会返回两个孩子,右边和左边。

如果BinaryTree是(专业)Tree,那么您就拥有GetChildren的专用版本。

如果您不希望基类成员存在于派生类中,请将它们设为私有,如果您希望它们是公共的,那么您必须考虑使用组合而不是继承

答案 1 :(得分:3)

您可以说class BinaryTree:protected树或class BinaryTree:private树,而不是使用公共树。或者,您可以将树包含为二进制树中的数据成员

例如:

class BinaryTree {
public:
    int getLeftChild();
    int getRightChild();
    ...
private:
   Tree tree;
    int leftChild;
    int rightChild;
    ...
};

答案 2 :(得分:3)

在C ++ 11中,您可以在派生类中将getChildren()设置为已删除:

vector<int> getChildren() =delete;

答案 3 :(得分:3)

你不能&#34;禁用&#34;成员,但您可以在继承的类中将任何成员设为私有:

class A {
public:
 int x;
};

class B : public A {
private:
 using A::x;
};

B b;
b.x; // error - member x is not accessible

所以在B类之外,用户不能(至少是错误地)访问x

答案 4 :(得分:-1)

pivate:   
vector<int> children;
vector<int> getChildren();

此私有范围在派生类中不可用。