让我们说我有两个类: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;
}
我有两个错误:
&#39;的getSize&#39;是foo的私人成员
和
无法将foo2强制转换为其私有基类foo。
答案 0 :(得分:2)
默认情况下,通过类继承是私有的。这意味着继承的数据成员和成员函数在派生类中是私有的,只能通过自身或类的朋友访问。
使用关键字public
指定公共继承:
class foo2 : public foo
{ ... }
请注意,这与struct
不同,后者对其数据成员和成员函数具有公共继承和公共访问权限。
答案 1 :(得分:1)
你在foo2.h中的foo2声明导致了这个问题:
...
class foo2: foo
{
...
一般情况下:
在C ++中,每个继承类都有继承访问说明符,就像每个类(private,protected,public)中都有成员(函数)访问说明符一样。这些说明符决定什么是最开放的级别,基类的成员(函数)将在派生类中可用。
请注意,“最开放”表示继承访问说明符和成员(函数)访问说明符的更严格:
公开继承+ 公开成员(函数)= 公开成员(函数)
公开继承+ 受保护成员(函数)= 受保护成员(函数)
公开继承+ 私有成员(函数)= 私有成员(函数)
受保护继承+ 公开成员(函数)= 受保护成员(函数)
受保护继承+ 受保护成员(函数)= 受保护成员(函数)
受保护继承+ 私有成员(函数)= 私有成员(函数)
私有继承+ 公开成员(函数)= 私有成员(函数)(您的情况)
私有继承+ 受保护成员(函数)= 私有成员(函数)
私有继承+ 私有成员(函数)= 私有成员(函数)
在您的情况下:
默认继承访问说明符是私有的,因此这里私有地继承foo(这意味着从foo继承的每个函数和成员在foo2中都是私有的)。因为这个foo.getsize()从foo2的角度变成私有的,你无法调用它。
解决方案:将上面的行更改为以下内容:
class foo2 : public foo
有关该主题的更多信息:SO Question: C++ access specifiers
P.S。:当我使用术语成员(函数)时,我指的是数据成员和成员函数。