例如,假设现在我们有两个类,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()不是我们在派生类中想要的。我们可能根本就不使用它们但它们仍然存在。那么如何在派生类中禁用这些元素呢?
由于
答案 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();
此私有范围在派生类中不可用。