C++不会让我从基类调用公共方法

C++ won't let me call a public method from a base class

本文关键字:调用 方法 基类 C++      更新时间:2023-10-16

假设我有两个类:foo和foo2,它们是这样写的:

foo.h:

#ifndef __InheritanceTest__foo__
#define __InheritanceTest__foo__
#include <stdio.h>
class foo
{
public:
    foo();
    int getSize();
protected:
    int size;
};
#endif

foo.cpp:

#include "foo.h"
foo::foo()
{
    size = 23;
}
int foo::getSize()
{
    return size;
}

foo2.h:

#ifndef __InheritanceTest__foo2__
#define __InheritanceTest__foo2__
#include <stdio.h>
#include "foo.h"
class foo2: foo
{
public:
    foo2();
};
#endif

foo2.cpp:

#include "foo2.h"
foo2::foo2()
{
    size = size *2;
}

这是我的主菜:

#include <iostream>
#include "foo.h"
#include "foo2.h"
int main(int argc, const char * argv[]) {
    // insert code here...
    std::cout << "Hello, World!n";
    foo2 f2;
    int i = f2.getSize();
    std::cout << i << "n";
    return 0;
}

我有两个错误:

"getSize"是foo 的私人成员

不能将foo2强制转换为其私有基类foo。

默认情况下,通过类继承是私有的。这意味着继承的数据成员和成员函数在派生类中是私有的,只能通过其自身或类的朋友访问。

使用关键字public指定公共继承:

class foo2 : public foo
{ ... }

请注意,这与struct不同,后者对其数据成员和成员函数具有公共继承和公共访问权限。

您在foo2.h中的foo2声明导致了这个问题:

...
class foo2: foo
{
...

一般情况下:

在C++中,每个继承类都有继承访问说明符,就像每个类(私有、受保护、公共)中都有成员(函数)访问说明符一样。这些说明符决定什么是最开放的级别,基类的成员(函数)s将在派生类中可用。

请注意,"最开放"表示继承访问说明符和成员(函数)访问说明符中更严格的一个:

公共继承+公众成员(函数)=公开会员(函数)

公共继承+受保护成员(函数)=被保护

公共继承+私有成员(函数)=私人会员(函数)

受保护继承+公共成员(函数)=被保护

protected继承+protected成员(函数)=protected会员(函数)

受保护继承+私有成员(函数)=私人会员(函数)

私有继承+公共成员(函数)=私人会员(函数)(您的情况)

私有继承+受保护成员(函数)=私人会员(函数)

私有继承+专用成员(函数)=私人会员(函数)

在您的情况下:

默认的继承访问说明符是private,因此foo在这里是private继承的(这意味着从foo继承的每个函数和成员在foo2中都是private)。因此,从foo2的角度来看,foo.getsize()变成了私有的,您不能调用它。

解决方案:将上面的行更改为以下行:

class foo2 : public foo

更多关于主题:SO问题:C++访问说明符

附言:当我使用术语成员(函数)时,我指的是数据成员和成员函数。