C++不会让我从基类调用公共方法
C++ won't let me call a public method from a base class
假设我有两个类: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++访问说明符
附言:当我使用术语成员(函数)时,我指的是数据成员和成员函数。
- 在c++中多次调用方法
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 接收字符串并使用它来调用方法C++
- 使用 gmock c++ 在真实对象上调用方法
- 不带预处理器的调用方法/文件的文件名/行号
- JNI从Android调用C++方法
- 在 C++ 的 Switch Case 中创建对象后对对象调用方法
- 如何使用接口指针调用方法,该指针是其具体类的一部分,而不是接口的一部分
- 从内部类中的方法从包含类调用方法
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- 为什么派生类的实例从基类调用方法?
- 实例化对象并调用方法,使用单行语法在 C# 或 C++ 中返回值?
- C++当您取消引用指向类对象的指针,然后将其作为引用返回时,是否可以对此引用调用方法
- 通过模板函数对未知类型调用方法
- 从基于迭代器的for循环转换后,如何在map::find()中调用方法
- 创建一个C++DLL以从C#DLL调用方法
- 如何从qt中的类中调用方法
- 如何在不迭代的情况下对数组中的每个元素调用方法
- C++11 - 获取编译时的所有类变量,并在没有 Boost 的情况下为它们调用方法
- C ++:如何在不创建对象的情况下在主函数中调用方法