Something about virtual function and pure virtual function

本文探讨了C++中虚拟函数的必要性及其实现方式,特别强调了纯虚函数的特点和在子类中的应用。通过示例展示了如何正确使用虚拟函数和纯虚函数,确保类的正确继承性和多态性。

Firstly, let's demonstrate a fact that virtual function must be implemented.

class A {
public:
	A() { a = 0; }
    virtual void a1();
    int a2();
private:
    int a;
};

int main() {
	A a;
	return 0;
}


A strange error about construction occurs. Now, let's see the correct version.

class A {
public:
	A() { a = 0; }
    virtual void a1() { a = 1;}
    int a2();
private:
    int a;
};

int main() {
	A a;
	return 0;
}
It is right. By the way, you can see the common member function could avoid implementation.

In contrast, the pure virtual function mustn't be implemented.

class A {
public:
	A() { a = 0; }
    virtual void a3() =0 { a = 1;}
private:
    int a;
};

int main() {
	return 0;
}


Another example:

class A {
public:
	A() { a = 0; }
    virtual void a3() =0;
private:
    int a;
};

class B: public A {
public:
	B(): A() { }
};

class C: public B {
public:
	C(): B() {}
	void a3() {}
};

int main() {
	B b;
	C c;
	return 0;
}


However, the correct should be

class A {
public:
	A() { a = 0; }
    virtual void a3() =0;
private:
    int a;
};

class B: public A {
public:
	B(): A() { }
};

class C: public B {
public:
	C(): B() {}
	void a3() {}
};

int main() {
//	B b;
	C c;
	return 0;
}

From this experiment, we can see that pure virtual function doesn't necessarily be implemented in its subclass and hence its subclass is still a virtual class.


### SystemVerilog 中的 Pure Virtual Function 概念与用法 在 SystemVerilog 中,`pure virtual function` 是接口或抽象类中的一种特殊方法定义。这种函数没有具体的实现,仅用于定义接口的行为规范。任何从包含 `pure virtual function` 的类派生的子类都必须提供该函数的具体实现[^1]。 #### 1. 抽象类与纯虚函数 为了声明一个类为抽象类,可以使用 `virtual` 关键字,并结合 `pure virtual function` 来定义接口行为。抽象类不能直接实例化,只能作为基类供其他类继承。以下是一个简单的例子: ```systemverilog class Vehicle; // 定义一个纯虚函数 pure virtual function int get_speed(); endclass ``` 在这个例子中,`Vehicle` 类是一个抽象类,因为它包含了一个未实现的 `pure virtual function`,即 `get_speed()` 函数。任何继承自 `Vehicle` 的类都必须实现 `get_speed()` 函数,否则编译器会报错[^1]。 #### 2. 接口中的 Pure Virtual Function 除了类之外,SystemVerilog 的接口也可以包含 `pure virtual function`。这些函数用于定义接口的行为规范,而具体实现则由实现该接口的模块或类提供。例如: ```systemverilog interface class MyInterface; pure virtual function void do_something(); endclass ``` 在这个例子中,`MyInterface` 是一个接口类,它包含了一个纯虚函数 `do_something()`。任何实现该接口的类都需要提供 `do_something()` 的具体实现。 #### 3. 子类的实现 当一个类继承了包含 `pure virtual function` 的抽象类时,必须为每个纯虚函数提供具体的实现。例如: ```systemverilog class Car extends Vehicle; int speed = 100; // 实现纯虚函数 function int get_speed(); return speed; endfunction endclass ``` 在这个例子中,`Car` 类继承了 `Vehicle` 类,并实现了 `get_speed()` 函数。如果没有实现该函数,编译器会报错,提示 `Car` 类未完全实现其父类的接口。 #### 4. 使用场景 `pure virtual function` 常用于以下场景: - 定义接口或抽象类的行为规范。 - 确保所有子类都实现特定的功能。 - 提高代码的可维护性和扩展性。 通过这种方式,可以强制子类遵循父类或接口的设计规范,从而提高代码的可读性和一致性。 ### 示例代码 以下是一个完整的示例,展示了如何在 SystemVerilog 中使用 `pure virtual function`: ```systemverilog class Animal; pure virtual function string make_sound(); endclass class Dog extends Animal; function string make_sound(); return "Woof"; endfunction endclass class Cat extends Animal; function string make_sound(); return "Meow"; endfunction endclass module testbench; initial begin Animal animal; Dog dog = new(); Cat cat = new(); animal = dog; $display("Dog says: %s", animal.make_sound()); animal = cat; $display("Cat says: %s", animal.make_sound()); end endmodule ``` 在这个示例中,`Animal` 类是一个抽象类,包含一个 `pure virtual function` `make_sound()`。`Dog` 和 `Cat` 类分别继承了 `Animal` 并实现了 `make_sound()` 函数。通过多态的方式,可以在运行时动态调用不同子类的实现。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值