1

我有一个关于纯虚函数的问题。我不清楚它是如何工作的,以及我们何时需要使用纯虚函数。这是我不明白的例子:

file.h

class A
{
public :
            A();
            ~A();

            virtual void func1(void) = 0;
            virtual UINT32 func2(void) = 0;
            UINT32 initialize(void) = 0;
}


file.cpp

UINT32 A:initialize (void)
{
            func1();
            func2();
            return (result);
}

谁能详细解释这个例子实际上做了什么以及结果是什么?我非常感谢您的帮助和知识。非常感谢你。

4

2 回答 2

1

(注意, for 的声明initialize()不应该是虚拟的,并且initialize()应该返回的实现func2()可能。因为这是一个示例,它实际上并不重要initialize(),但它应该正确编译。)

虚函数的主要目的是实现多态性。

A定义了两个纯虚方法,并initialize调用它们。这允许程序中的代码在A不知道子类的情况下初始化某些类型。可能有许多子类,每个子类在和中的A作用可能略有不同。由于只知道的代码有时会通过 初始化不同类型的对象,因此可以称为多态类型。func1()func2()AAA

class B : public A {
    void func1 () { std::cout << "B::func1" << std::endl; }
    UINT32 func2 () { return 1; }
};

class C : public A {
    void func1 () { std::cout << "C::func1" << std::endl; }
    UINT32 func2 () { return 2; }
};

void call_initialize (A *a) {
    std::cout << a->initialize()  << std::endl;
}

B b;
C c;
call_initialize(&b);
call_initialize(&c);

输出结果:

B::func1
1
C::func1
2

这是多态行为的一个例子,因为输出是不同的,这取决于是否AB或子类化C

于 2012-06-12T03:30:53.157 回答
0

函数func1&func2未在 A 中实现(根据显示的代码)。
如果它们被实现,那么它们就会被调用。如果 A 有派生类,并且派生类的对象是多态创建的,即

class B : public A
{
 .....
};

A* obj = new B();

obj->initialize();

如果 B 实现了它们,则调用 B 版本的 func1() 和 func2()。

正如 Ethan 在评论中提到的,您没有从 func2() 获取结果。
所以你需要写

UINT32 result = func2(); 

或者

return func2();
于 2012-06-12T03:28:12.653 回答