Sashkinzz Asked:2023-11-25 07:31:50 +0000 UTC2023-11-25 07:31:50 +0000 UTC 2023-11-25 07:31:50 +0000 UTC 字段和方法的继承 772 class a{ public: int y; void f(){cout<<6;} }; class b: public a{ public: int y; void f(){cout<<7;} }; 为什么可以让函数和变量与父类同名呢?也就是说,为什么继承人中不会出现名称冲突,因为父代的所有这些方法和字段都已经存在于其中? c++ 1 个回答 Voted Best Answer Harry 2023-11-25T14:35:54Z2023-11-25T14:35:54Z 当上下文显而易见时,某些实体的名称(y与简单的成员相同)是缩写形式。y实际使用的是完全限定名称,其中包括它引用的类和对象。当然,同一类中可以有两个具有相同成员的对象,您一点也不介意吗?因为您不单独使用成员名称,而是附加对象名称或指向它的指针。 因此,在您的示例中,全名包括类名。在这种情况下,在后代类中,来自祖先的名称被隐藏,从某种意义上说,通过短名称调用y会导致调用当前上下文中的成员,即后代类的成员。 当您必须在名称中指示多个类时,可能会出现相当复杂的继承。例如,在下面的多重继承示例中,要访问成员,A您必须指明正在A 访问哪个成员:) struct A { int x; void out() { cout << x << endl; } }; struct B: public A { int x; void out() { cout << x << endl; } }; struct C: public A { int x; void out() { cout << x << endl; } }; struct D: public B, public C { int x; void out() { cout << x << endl; } }; int main(int argc, char * argv[]) { D d; d.C::x = 0; d.B::x = 1; d.C::A::x = 2; d.B::A::x = 3; d.B::A::out(); d.C::A::out(); d.B::out(); d.C::out(); } PS 嘿,标准大师!我发现上面的代码在 Visual C++ 中编译时会发出一声巨响,但在例如 G++ 中却不想编译。谁错了?就我个人而言,我没有看到任何歧义 - 完全限定名称是不同的,那么存在什么样的歧义呢?...
当上下文显而易见时,某些实体的名称(
y与简单的成员相同)是缩写形式。y实际使用的是完全限定名称,其中包括它引用的类和对象。当然,同一类中可以有两个具有相同成员的对象,您一点也不介意吗?因为您不单独使用成员名称,而是附加对象名称或指向它的指针。因此,在您的示例中,全名包括类名。在这种情况下,在后代类中,来自祖先的名称被隐藏,从某种意义上说,通过短名称调用
y会导致调用当前上下文中的成员,即后代类的成员。当您必须在名称中指示多个类时,可能会出现相当复杂的继承。例如,在下面的多重继承示例中,要访问成员,
A您必须指明正在A访问哪个成员:)PS 嘿,标准大师!我发现上面的代码在 Visual C++ 中编译时会发出一声巨响,但在例如 G++ 中却不想编译。谁错了?就我个人而言,我没有看到任何歧义 - 完全限定名称是不同的,那么存在什么样的歧义呢?...