我在为我的大学工作做多基础继承项目时偶然发现了这个问题。我的问题的例子和代码本身:
我设置3个类,A,B和C.
B从A.公开继承
C从B.公开继承
我想在B中公开设置一个方法,它确实将一个指向A类对象的指针作为参数。但是它应该只能使用A类对象,而不能使用B或C.
问题是Visual Studio 2013没有显示任何错误,并且只允许B类对象在C类对象上使用我的方法,这与我想要实现的完全相反。
为什么会这样?
这是否意味着继承有些使C对象同时被解释为A,B和C类型?如果没有,是否有一种直接的方法来绑定一个方法,只用于它继承的类(A和B对象上的c方法)?如果我在任何地方都错了,请随意纠正我,我仍然是编程的新手。谢谢您的帮助!
``
class A
{
private:
int x;
string z;
public:
void SetZ()
{
cout << "Set Z: ";
cin >> z;
}
string GetZ()
{
return this->z;
}
};
class B
:public A
{
public:
void use_base(A* k)
{
cout << "here and now, i'm using " << k->GetZ() << " however i, " << this->GetZ() << ", might want to!";
}
};
class C
:public B
{
void use_base(A* k)
{
cout << "extra";
}
};
int main()
{
A Bob;
B Mark;
Bob.SetZ();
Mark.SetZ();
C Karl;
Mark.use_base(&Karl); // doesn't show any error
return 0;
}`
答案 0 :(得分:2)
如果B
从A
公开继承,那么B*
可以隐式转换为A*
,因此可以使用{{A*
调用B*
的函数1}}参数。为防止这种情况,您可以使继承受保护或私有。但是,这可能会产生其他问题。
为防止意外传递B*
,您可以声明另一个需要B*
的重载并将其删除。此重载将赢得B*
和C*
参数,并导致编译错误。您还可以使用模板来概括此方法,因此可以防止将指针传递给派生自A
的任何类,而无需命名所有此类。
void use_base(A* k) { /* do something */ }
void use_base(B*) = delete;
但是,这并不能阻止某人明确地将B*
或C*
转换为A*
并调用A*
超载。