QT第二天

多态性(Polymorphism),虚函数(Virtual Function),以及纯虚函数(Pure Virtual Function)都是面向对象编程中的重要概念,用于实现对象之间的灵活性和可扩展性。

1.多态性(Polymorphism):多态性指的是同一个接口可以被不同的对象以不同的方式实现。这使得不同的类可以共享相同的接口,但可以根据其具体实现在运行时表现出不同的行为。多态性有两种类型:编译时多态性(静态多态性)和运行时多态性(动态多态性)。在C++中,运行时多态性是通过虚函数实现的。
2.虚函数(Virtual Function):虚函数是在基类中声明为虚拟的,并在派生类中进行重写(覆盖)的函数。通过使用虚函数,可以在运行时根据对象的实际类型来调用相应的函数。使用虚函数,可以实现运行时多态性,使得通过基类指针或引用调用函数时,能够调用到派生类的实现。

class Shape {
public:
    virtual void draw() {
        // 基类虚函数
    }
};

class Circle : public Shape {
public:
    void draw() override {
        // 派生类覆盖基类虚函数
    }
};


3.纯虚函数(Pure Virtual Function):纯虚函数是在基类中声明为虚拟的,但没有在基类中给出实现的函数。它的目的是要求派生类提供实现,否则派生类也会成为抽象类。一个包含纯虚函数的类被称为抽象基类(Abstract Base Class)。

class AbstractShape {
public:
    virtual void draw() = 0; // 纯虚函数
};

class ConcreteCircle : public AbstractShape {
public:
    void draw() override {
        // 派生类必须提供纯虚函数的实现
    }
};

总之,多态性通过虚函数和纯虚函数的概念实现,使得面向对象的程序能够更加灵活地适应不同的场景和需求,同时提高了代码的可扩展性和可维护性。

在 C++ 中,将引用作为函数参数有以下几个特点:

1.传递引用可以避免拷贝:与传递对象本身相比,传递引用作为函数参数可以避免在函数调用过程中进行对象的拷贝操作,从而提高性能和效率,特别是对于大对象或类对象来说。
2.可以修改原始对象:通过传递引用,函数可以直接修改传递的对象,因为引用是原对象的别名。这使得函数能够对对象进行原地修改,而不需要返回修改后的对象。
3.引用参数需要传递有效对象:传递引用参数时,需要确保传递的是有效的对象,因为引用不能指向空值(nullptr)。如果传递了无效的对象引用,可能会导致未定义的行为。
4.可以避免拷贝构造函数的调用:当传递对象的副本时,会调用拷贝构造函数来创建一个新的对象,但传递引用参数时不会触发拷贝构造函数的调用。
5.对原始对象的修改在函数外可见:由于传递的是原始对象的引用,对对象的修改会在函数外部可见,不像传值参数那样只是在函数内部有效。

以下是一个使用引用作为函数参数的示例:
#include <iostream>

void modifyValue(int &x) {
    x = x * 2;
}

int main() {
    int num = 5;
    std::cout << "Original value: " << num << std::endl;

    modifyValue(num);

    std::cout << "Modified value: " << num << std::endl;

    return 0;
}

在这个示例中,modifyValue 函数接受一个整数引用作为参数,直接修改传递的整数值。在 main 函数中,调用 modifyValue 后,原始的 num 值被修改,这种修改在函数外部可见。

在 C++ 中,结构(struct)和联合(union)都是用来组织数据的方式,但它们有一些重要的区别。以下是结构和联合之间的主要区别:

1.内存布局:


2.结构(struct):结构中的每个成员都在内存中占据独立的空间,成员之间不会共享内存。这意味着结构的大小至少是其所有成员大小之和。
3.联合(union):联合中的所有成员共享同一块内存,联合的大小取决于最大成员的大小。只有联合中的一个成员可以被有效地存储。


4.成员访问:


5.结构(struct):可以同时访问结构中的多个成员,每个成员都有自己的地址。
6.联合(union):只能访问联合中当前活动的成员,因为它们共享相同的内存空间。


7.占用空间:


8.结构(struct):占用的内存空间取决于所有成员的大小之和,每个成员都有自己的内存空间。
9.联合(union):占用的内存空间取决于最大成员的大小,不同成员共享同一块内存。


10.用途:


结构(struct):用于存储一组不同类型的数据,每个成员都有自己的含义。
联合(union):用于在同一块内存中存储不同类型的数据,但只会使用其中一个成员。

下面是一个简单的示例,说明结构和联合之间的区别:
#include <iostream>

struct MyStruct {
    int a;
    double b;
};

union MyUnion {
    int x;
    double y;
};

int main() {
    MyStruct s;
    MyUnion u;

    std::cout << "Size of struct: " << sizeof(s) << std::endl; // Output: Size of struct: 12
    std::cout << "Size of union: " << sizeof(u) << std::endl;   // Output: Size of union: 8

    s.a = 5;
    s.b = 3.14;

    u.x = 10;
    u.y = 2.71;

    std::cout << "Struct members: " << s.a << ", " << s.b << std::endl; // Output: Struct members: 5, 3.14
    std::cout << "Union members: " << u.x << ", " << u.y << std::endl;   // Output: Union members: 2, 2.71

    return 0;
}

需要根据具体的需求来选择使用结构还是联合。如果需要在同一块内存中存储不同类型的数据,而且每次只会使用其中一个成员,那么联合可能更合适。如果需要同时存储多个成员,每个成员都有自己的含义,那么结构更适合。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值