抽象类的顶级理解

本文介绍了抽象类的概念、语法特性,包括抽象方法的定义与限制,以及模板设计模式的应用实例,展示了如何通过抽象类和多态实现不同任务的高效计算并测量执行时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.抽象类的介绍

2. 抽象类语法

3.模板设计模式


1.抽象类的介绍

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果 一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

上述概念可能过于抽象,其实我们可以代入场景去理解。

当父类的一些方法不能确定时,可以用abstract关键字来修饰该方法, 这个方法就是抽象方法,用abstract来修饰该类就是抽象类。


2. 抽象类语法

1. 抽象类不能直接实例化对象

 否则会报错

2.抽象类也是类,内部可以包含普通方法和属性,甚至构造方法,但abstract只修饰类和方法,不修饰属性和其他。

3. 抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量 

4.抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类

  abstract class Rect  {
    private double length;
    private double width;
    Rect(double length, double width){
        this.length = length;
        this.width = width;
    }
}

5.抽象方法不能是 private

 6.抽象方法不能被finalstatic修饰,因为抽象方法要被子类重写

7. 抽象类必须被继承,并且继承后子类要重写父类中的抽象方法 ,否则子类也是抽象类,必须要使用 abstract 修 饰

8.抽象方法不能有主体


3.模板设计模式

(1)有多个类,完成不同的任务,A任务计算1到25的和,B任务计算1乘到10000000

(2))要求统计得到各自完成任务的时间

public abstract class Text01 {
    public abstract void job();//抽象方法
    public void calculateTime() {//实现方法,调用 job 方法
//得到开始的时间
        long start = System.currentTimeMillis();
        job(); //动态绑定机制
//得的结束的时间
        long end = System.currentTimeMillis();
        System.out.println("任务执行时间 " + (end - start));
    }

    public static void main(String[] args) {
        A a=new A();
        a.calculateTime();
        B b=new B();
        b.calculateTime();

    }
}
class A extends Text01{
    @Override
    public void job() {
        long  num = 1;
        for (long i = 1; i <= 25; i++) {
            num *= i;
        }
        System.out.println("A工作完成"+num);
    }
}
class B extends Text01{

    @Override
    public void job() {
        long num = 0;
        for (long i = 1; i <= 10000000; i++) {
            num += i;
        }
        System.out.println("B工作完成"+num);
    }
}

运行结果:


以上为我个人的小分享,如有问题,欢迎讨论!!! 

都看到这了,不如关注一下,给个免费的赞 

<think>嗯,用户问的是关于C++ Qt中“不能实例化抽象类”的错误。首先,我得回忆一下抽象类在C++中的定义。抽象类是指含有至少一个纯虚函数的类,这样的类不能被实例化,只能作为基类被继承。Qt中有很多这样的类,尤其是那些设计为需要子类化以提供具体实现的类。 用户可能在使用Qt时尝试直接创建了一个抽象类的对象,比如QWidget或其他类似的基类。这时候编译器会报错,提示不能实例化抽象类。需要确定具体是哪个类导致了问题,以及该类中有哪些纯虚函数没有被实现。 接下来,我应该考虑用户可能的代码情况。例如,用户可能自己创建了一个继承自QObject或其他Qt基类的子类,但没有覆盖所有的纯虚函数,导致子类仍然是抽象的。或者,可能在实例化某个Qt类时,错误地选择了抽象类而不是其具体子类,比如使用了QDialog而不是QDialog的具体子类。 需要提醒用户检查类的定义,查看是否有纯虚函数未被重写。另外,Qt中的某些类如QWidget,如果作为顶级窗口部件,可能需要特定的构造函数参数,比如parent参数,如果没有正确提供,也可能导致问题。 还要考虑到用户可能误解了Qt的类层次结构,比如直接实例化了一个接口类,而没有使用具体的实现类。例如,使用QAbstractItemModel而不是其派生类如QStandardItemModel。 总结解决步骤应该是:1. 确认报错的具体类和行号;2. 检查该类是否有未实现的纯虚函数;3. 确保所有纯虚函数在子类中被正确重写;4. 如果自定义类,检查是否有遗漏的虚函数;5. 确认使用的Qt类是否为抽象类,并替换为具体子类。 此外,可能需要提供示例代码,说明正确和错误的情况对比,帮助用户理解问题所在。例如,展示一个继承自QWidget的子类如何正确实现纯虚函数,或者指出常见的Qt抽象类及其具体子类。</think>在C++ Qt开发中遇到"不能实例化抽象类"错误,通常与以下两种情况相关: 1. **Qt框架自身的抽象类** 如`QWidget`、`QAbstractItemModel`等基类,它们: - 包含纯虚函数(如`QWidget`的`paintEvent()`) - 需要继承并实现所有纯虚函数才能实例化 - 正确用法示例: ```cpp // 正确:继承并实现纯虚函数 class MyWidget : public QWidget { protected: void paintEvent(QPaintEvent*) override { /* 具体实现 */ } }; // 错误:直接实例化抽象类 QWidget widget; // 编译报错 ``` 2. **自定义抽象类** 当您自己定义的类出现此问题时: ```cpp class MyAbstractClass : public QObject { public: virtual void mustImplement() = 0; // 纯虚函数 }; class ConcreteClass : public MyAbstractClass { public: // 必须实现所有纯虚函数 void mustImplement() override { /* 实现代码 */ } }; ``` **常见解决方案:** 1. 检查继承的Qt类文档,确认是否为抽象类 2. 使用`override`关键字确保正确重写虚函数 3. 查看编译错误提示的未实现函数列表 4. 对于自定义类,确保: - 所有纯虚函数(以`= 0`结尾)都被实现 - 派生类中没有遗漏的虚函数重写 **典型Qt抽象类及对应具体类对照表:** | 抽象类 | 可实例化的具体类 | |----------------------|--------------------------| | QWidget | QPushButton, QLabel | | QAbstractItemModel | QStandardItemModel | | QAbstractButton | QPushButton, QCheckBox | | QAbstractScrollArea | QScrollArea, QTextEdit | **调试建议:** 1. 在Qt Creator中使用"Find Usages"查找纯虚函数实现 2. 检查类声明中的`override`关键字是否正确使用 3. 使用`dynamic_cast`验证对象是否完整实现了所有虚函数 4. 注意构造函数参数(特别是parent参数)的传递是否正确 如果问题仍然存在,建议提供具体的: - 错误提示全文 - 相关类定义代码 - 继承关系说明 这将有助于更精准地定位问题根源。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值