C/C++开发
1.友元是什么 可以传递么?
友元(friend)是一个能够访问类的私有和保护成员的函数或类。友元不能传递,只有明确声明的友元才能访问该类的私有和保护成员。
2.如何解决菱形继承的问题?
用虚基类,这样派生的是最后覆盖的虚函数。
3.虚函数可以声明为静态函数么?
不可以。静态函数与类的对象无关,而虚函数是为了实现对象的多态,故不可以。
4.如何将数据定义为寄存器变量?
关键字register register int a
5.‘\091’错哪里了
\0代表八进制的转义字符,故不可能出现数字9
6.继承相关问题
在 C++ 中,继承是一种用于复用代码和建立类之间关系的机制。而**公有继承(public inheritance)**是继承的一种形式,它控制了基类成员在派生类中的可访问性,并且决定了类之间的类型关系。
公有继承的定义:
公有继承是指当一个类通过 public
关键字继承自基类时,基类的**公有成员(public members)和受保护成员(protected members)**在派生类中保持其访问权限:
- 基类的公有成员在派生类中仍然是公有的。
- 基类的受保护成员在派生类中仍然是受保护的。
- 基类的**私有成员(private members)**则无法在派生类中直接访问,但派生类可以通过基类的公有或受保护成员访问这些私有成员。
公有继承下的子类型关系:
在公有继承的情况下,派生类是基类的一个子类型,这意味着可以将派生类的对象赋值给基类的引用或指针。这就是**“is-a”(是一个)的关系,即派生类对象“是一个”基类对象**。
这背后的原理是 Liskov 替换原则(Liskov Substitution Principle,LSP),它要求派生类能够替代基类的实例而不会破坏程序的正确性。在公有继承中,派生类能够继承并公开基类的接口和行为,因此它可以被视为基类的一个子类型。
为什么只有公有继承下派生类是基类的子类型?
只有在公有继承的情况下,派生类和基类才会保持明确的子类型关系。这是因为:
- 在公有继承下,基类的公有接口被派生类继承并公开,因此可以通过基类的指针或引用来操作派生类对象,仍然能够访问基类的公有成员。
- 派生类保留了基类的接口和功能,因此可以被认为是基类的扩展。
其他继承方式:
-
私有继承(private inheritance):
- 基类的公有成员和受保护成员在派生类中变为私有的。
- 派生类不能向外界公开基类的接口,因此不能被当作基类的对象使用。
- 私有继承表示派生类并不是基类的子类型,而是一种实现继承(用于代码复用),而不是接口继承。
-
受保护继承(protected inheritance):
- 基类的公有成员和受保护成员在派生类中变为受保护的。
- 派生类只能作为基类的子类进行扩展,但不能被当作基类的对象使用。
- 外部类不能通过基类的指针或引用操作派生类对象。
代码示例:
公有继承(派生类是基类的子类型):
#include <iostream>
using namespace std;
class Base {
public:
void show() {
cout << "Base class function" << endl;
}
};
class Derived : public Base {
public:
void display() {
cout << "Derived class function" << endl;
}
};
int main() {
Derived d;
Base* basePtr = &d; // 公有继承允许基类指针指向派生类对象
basePtr->show(); // 可以通过基类指针调用基类的公有方法
// basePtr->display(); // 错误,基类指针不能调用派生类方法
return 0;
}
私有继承(派生类不是基类的子类型):
#include <iostream>
using namespace std;
class Base {
public:
void show() {
cout << "Base class function" << endl;
}
};
class Derived : private Base { // 私有继承
public:
void display() {
cout << "Derived class function" << endl;
}
};
int main() {
Derived d;
// Base* basePtr = &d; // 错误,私有继承不能通过基类指针访问派生类对象
d.display(); // 可以直接调用派生类的方法
return 0;
}
总结:
- 公有继承是派生类与基类之间的“is-a”关系,派生类是基类的子类型,可以用基类指针或引用指向派生类对象,并且可以访问基类的公有成员。
- 只有在公有继承的情况下,派生类才是基类的子类型,符合面向对象的多态性原则。
- 私有继承和受保护继承则不允许这种子类型关系,派生类不能作为基类的对象使用,更多用于实现细节的隐藏和代码复用。