秋招笔面记录_10月14日

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),它要求派生类能够替代基类的实例而不会破坏程序的正确性。在公有继承中,派生类能够继承并公开基类的接口和行为,因此它可以被视为基类的一个子类型。

为什么只有公有继承下派生类是基类的子类型?

只有在公有继承的情况下,派生类和基类才会保持明确的子类型关系。这是因为:

  • 在公有继承下,基类的公有接口被派生类继承并公开,因此可以通过基类的指针或引用来操作派生类对象,仍然能够访问基类的公有成员。
  • 派生类保留了基类的接口和功能,因此可以被认为是基类的扩展。

其他继承方式:

  1. 私有继承(private inheritance)

    • 基类的公有成员和受保护成员在派生类中变为私有的
    • 派生类不能向外界公开基类的接口,因此不能被当作基类的对象使用。
    • 私有继承表示派生类并不是基类的子类型,而是一种实现继承(用于代码复用),而不是接口继承。
  2. 受保护继承(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”关系,派生类是基类的子类型,可以用基类指针或引用指向派生类对象,并且可以访问基类的公有成员。
  • 只有在公有继承的情况下,派生类才是基类的子类型,符合面向对象的多态性原则。
  • 私有继承受保护继承则不允许这种子类型关系,派生类不能作为基类的对象使用,更多用于实现细节的隐藏和代码复用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值