C++ 子类能不能改变父类中成员的访问权限?
2014-09-17 19:15
316 查看
先看一个例子:
#include <iostream>
using namespace std;
class Base
{
public:
Base(int i): common(i) {}
virtual ~Base() { cout << "destructing Base" << endl; }
virtual void Both() const { cout << "common=" << common << endl; }
virtual void ForA() = 0;
virtual void ForB() = 0;
protected:
int common;
};
class A: public Base
{
public:
A(int i, int aa): Base(i), a(aa) {}
~A() { cout << "destructing A" << endl; }
void ForA() { cout << "A: a=" << a << endl; }
private:
void ForB() { cout << "A: private ForB()" << endl; }
int a;
};
class B: public Base
{
public:
B(int i, int bb): Base(i), b(bb) {}
~B() { cout << "destructing B" << endl; }
void ForB() { cout << "B: b=" << b << endl; }
private:
void ForA() { cout << "B: private ForA()" << endl; }
int b;
};
int main()
{
Base* pBase = new A(0, 100);
pBase->ForA();
pBase->ForB(); // ok
delete pBase;
pBase = new B(0, 200);
pBase->ForA(); // ok
pBase->ForB();
delete pBase;
A* pA = new A(0, 111);
pA->ForA();
pA->ForB(); // error
delete pA;
return 0;
}
编译时报错:
> g++ -Wall test.cpp -o test
test.cpp: In function 'int main()':
test.cpp:26: error: 'virtual void A::ForB()' is private
test.cpp:58: error: within this context
屏蔽第 58 行之后的输出结果:
A: a=100
A: private ForB()
destructing A
destructing Base
B: private ForA()
B: b=200
destructing B
destructing Base
A: a=111
destructing A
destructing Base
也就是说 C++在编译阶段就根据指针对应的类确定了成员的访问权限。
#include <iostream>
using namespace std;
class Base
{
public:
Base(int i): common(i) {}
virtual ~Base() { cout << "destructing Base" << endl; }
virtual void Both() const { cout << "common=" << common << endl; }
virtual void ForA() = 0;
virtual void ForB() = 0;
protected:
int common;
};
class A: public Base
{
public:
A(int i, int aa): Base(i), a(aa) {}
~A() { cout << "destructing A" << endl; }
void ForA() { cout << "A: a=" << a << endl; }
private:
void ForB() { cout << "A: private ForB()" << endl; }
int a;
};
class B: public Base
{
public:
B(int i, int bb): Base(i), b(bb) {}
~B() { cout << "destructing B" << endl; }
void ForB() { cout << "B: b=" << b << endl; }
private:
void ForA() { cout << "B: private ForA()" << endl; }
int b;
};
int main()
{
Base* pBase = new A(0, 100);
pBase->ForA();
pBase->ForB(); // ok
delete pBase;
pBase = new B(0, 200);
pBase->ForA(); // ok
pBase->ForB();
delete pBase;
A* pA = new A(0, 111);
pA->ForA();
pA->ForB(); // error
delete pA;
return 0;
}
编译时报错:
> g++ -Wall test.cpp -o test
test.cpp: In function 'int main()':
test.cpp:26: error: 'virtual void A::ForB()' is private
test.cpp:58: error: within this context
屏蔽第 58 行之后的输出结果:
A: a=100
A: private ForB()
destructing A
destructing Base
B: private ForA()
B: b=200
destructing B
destructing Base
A: a=111
destructing A
destructing Base
也就是说 C++在编译阶段就根据指针对应的类确定了成员的访问权限。
相关文章推荐
- C++ 类的继承,子类以及之类的对象 对父类成员函数的访问权限
- C++中指向子类的父类指针访问父、子类成员时的权限和函数隐藏规则
- C++中子类对父类成员的访问
- c++父类指针强制转为子类指针后的测试(帮助理解指针访问成员的本质)(反多态)
- C++子类访问父类protected成员
- C++中父类成员变量和子类成员变量重复定义及访问方法的深入探究
- c++父类指针强制转为子类指针后的测试(帮助理解指针访问成员的本质)(反多态)
- c++模板类在继承中子类无法访问父类的成员
- Java中在从父类中继承的成员变量在子类改变,怎么父类(super.num)的成员也一起改变?
- 父类指针对子类成员变量的访问
- 子类能不能继承父类的私有成员
- C++成员变量、函数修饰符与访问权限
- [C++]父类与子类的静态成员变量、实例成员变量、构造函数的执行顺序
- c++子类能从父类中继承父类的静态成员函数吗
- C++成员访问权限
- c++学习——类成员的访问权限
- 子类和父类中方法和变量访问权限
- public继承后,父类与子类访问隐藏 熟练c/c++(三)
- C++中类成员访问权限的警醒
- c++子类和父类成员函数重名