为什么这不起作用,什么是好的选择?
class Grandparent
{
void DoSomething( int number );
};
class Parent : Grandparent
{
};
class Child : Parent
{
void DoSomething()
{
Grandparent::DoSomething( 10 ); // Does not work.
Parent::DoSomething( 10 ); // Does not work.
}
};
答案 0 :(得分:11)
class Grandparent
{
protected:
void DoSomething( int number );
};
class Parent : protected Grandparent
{
};
class Child : Parent
{
void DoSomething()
{
Grandparent::DoSomething( 10 ); //Now it works
Parent::DoSomething( 10 ); // Now it works.
}
};
至少需要看起来像这样。在使用类时,默认情况下是私有的,包括子类。
有一个完整的例子可以编译和运行。
答案 1 :(得分:0)
我猜你的代码没有编译 - 并且错误的主要来源缺少方法Child::DoSomething()
的返回类型说明符。
答案 2 :(得分:0)
class Grandparent
{
public:
void DoSomething( int number ){
cout<<number;
}
};
class Parent : public Grandparent
{
public:
void DoSomething(int x){
cout<<x<<'\n';
}
};
class Child : public Parent
{
public:
void DoSomething()
{
Grandparent::DoSomething( 10 ); // works.
Parent::DoSomething( 10 ); // works.
}
};
c ++中的默认继承类型为private,而C ++中的默认成员函数访问说明符为Private。因此,在任何情况下都不能访问GrandParent类的私有成员。您已将GrandParent的DoSomething()设置为公共或受保护的。然后提及适当的继承类型。
答案 3 :(得分:0)
(1)是的,当我们使用public或protected访问修饰符继承继承类时,我们只能访问派生类中的祖父母成员。
(2)被声明为protected的基类成员在该类外部无法访问,但是该类的任何派生类都可以访问它们。当您通过public或protected访问修饰符继承基类的受保护成员时,该数据成员访问说明符将在派生类中得到保护。
(3)默认情况下,访问修饰符在C ++中是私有的,继承在您的给定示例中。由于您尝试访问子类中基类的私有成员,因此必然会产生编译时错误。请也阅读下一点。
(4)声明为私有的基类成员当然会继承到派生类。但是,无论继承时使用了哪种访问修饰符,都无法访问它们。可用性与可访问性有关。基类的私有成员可用于后续派生类,但不可访问。在私有继承基类之后,我们可以使用sizeof(派生类对象)运算符进行检查。
让我们讨论另一件事。我们如何访问基类的私有成员? 好吧,我们可以通过使用朋友函数和指针来做到这一点。但是,在基类中声明Friend函数取决于该基类的创建者。所以,我们不会在这篇文章中谈论它。
class Base
{
private :
int x1,x2;
};
class Derived : public Base
{
public :
int x3;
void display(int *ptr)
{
cout << "the value of x1 = " << *(ptr) << endl;
cout << "the value of x2 = " << *(ptr+1) << endl;
cout << "the value of x3 = " << *(ptr+2) << endl;
}
};
int main()
{
Derived d;
int *ptr = (int *)&d.x3; // typecasting
*ptr = 3; // setting x3 as 3
ptr--;
*ptr = 2; // setting x2 as 2
ptr--;
*ptr = 1; // setting x1 as 1
ptr--;
d.display(ptr);
return 0;
}
我们已经成功访问了基类的私有成员。
我想分享的另一件事是:如果我们有一个虚拟的Grand Parent类,我们可以直接从子类中调用Grand Parent构造函数。但通常不允许直接调用祖父母构造函数,而必须通过父类进行调用。仅在使用virtual关键字时允许。