如何合并两个A和B类以定义C 中抽象类的功能

How to Merge two classes A and B to define the functions of a abstract class in C++

本文关键字:定义 抽象类 功能 合并 何合并 两个      更新时间:2023-10-16

在我的C 项目中,我有一个抽象类,该类定义了DLL的接口。称其为CabStractClass。

我有一个类斜方间,除了CabStractClass的1个功能外,所有功能都为所有功能定义了功能。我如何创建一个新的非抽象C类以继承CabStractClass?

这是我的尝试。它导致错误'e0322:不允许抽象类类型的对象" cclass"。

#include "stdafx.h"
class CAbstractClass
{
public:
    CAbstractClass(void) {};
    ~CAbstractClass(void) {};
    virtual int Fn1(int a) = 0;
    virtual double Fn2(int a, int b) = 0;
    virtual int Fn3(double a, double b) = 0;
};
class AClass
{
public:
    AClass(void) {};
    ~AClass(void) {};
    int Fn1(int a) { return 2 * a; }
    double Fn2(int a, int b) { return (double)a / (double)b; }
};
class BClass
{
public:
    BClass(void) {};
    ~BClass(void) {};
    int Fn3(double a, double b) { return (int) (a+b); }
};
// My guess at how to combine all the classes.
class CClass : public CAbstractClass, public AClass, public BClass
{
public:
    CClass(void) {};
    ~CClass(void) {};
};

int main()
{
    CClass C;       // E0322: object of abstract class type "CClass" is not allowed.

    return 0;
}

AClassBClass也必须从 CAbstractClass继承。FN1 FN2和FN3只是没有实现抽象类的虚拟方法,因此CClass也是摘要

class AClass : public CAbstractClass {
//...
};
class BClass : public CAbstractClass {
//...
};
class CClass : public virtual AClass, public virtual BClass {
//...
};

我不确定它是否可以使用单个cabStractClass完成,但是如果将抽象接口分为两个单独的抽象接口,则很容易:

#include <stdio.h>
class CAbstractClassA
{
public:
    virtual int Fn1(int a) = 0;
    virtual double Fn2(int a, int b) = 0;
};
class CAbstractClassB
{
public:
    virtual int Fn3(double a, double b) = 0;
};
class AClass : public CAbstractClassA
{
public:
    int Fn1(int a) { return 2 * a; }
    double Fn2(int a, int b) { return (double)a / (double)b; }
};
class BClass : public CAbstractClassB
{
public:
    int Fn3(double a, double b) { return (int) (a+b); }
};
// My guess at how to combine all the classes.
class CClass : public AClass, public BClass
{
public:
};
int main()
{
    CClass C;
    printf("Fn1(5) returns %in", C.Fn1(5));
    printf("Fn2(10,12) returns %fn", C.Fn2(10,12));
    printf("Fn3(3.14,6.28) returns %in", C.Fn3(3.14,6.28));
    return 0;
}

这是我最终使用的。我之所以选择它,是因为它独自留下了宏class。还有更多的工作:BCLASS中必须定义来自Aclass的每个成员功能。另一个好处是不需要CCLASS。

#include "stdafx.h"
class BAbstractClass
{
public:
    BAbstractClass(void) {};
    ~BAbstractClass(void) {};
    virtual int Fn1(int a) = 0;
    virtual double Fn2(int a, int b) = 0;
    virtual int Fn3(double a, double b) = 0;
};
class AClass
{
public:
    AClass(void) {};
    ~AClass(void) {};
    int Fn1(int a) { return 2 * a; }
    double Fn2(int a, int b) { return (double)a / (double)b; }
};

class BClass : public AClass, public BAbstractClass
{
public:
    BClass(void) {};
    ~BClass(void) {};
    int Fn3(double a, double b) { return (int)(a + b); }
    // Define a function for each of AClass' member functions.
    int Fn1(int a) { return AClass::Fn1(a); }
    double Fn2(int a, int b) { return AClass::Fn2(a, b); }
};

int main()
{
    BClass B;
    return 0;
}