首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >c++定义继承方案

c++定义继承方案
EN

Stack Overflow用户
提问于 2020-06-02 17:23:00
回答 1查看 46关注 0票数 1

代码可能写得不好,我想知道应该如何正确地完成它。

谢谢你的帮助

对于以下继承方案:→B→C

( a)定义类,假设A类是抽象类

( b)为所有类配备一个返回类名的虚拟名称方法

( c)添加虚拟析构函数

d)添加A类的全局函数朋友,使其能够执行与b点相同的功能

代码语言:javascript
运行
复制
#include <iostream>


using namespace std;


class A {

    public:

    A();
    virtual void name();
    {

        return A;


    }
    friend void ffriend()
    virtual ~A();

};

class B : public A{

    public:

    B();
    virtual void name();
    {

        return B;


    }

    virtual ~B();

};

class C : public B{

    public:

    C();
    virtual void name();
    {

        return C;


    }

    virtual ~C()

};





    friend void ffriend(&A){

        name.A();

    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-02 17:58:51

您的代码无法编译,并存在大量语法错误。

b)为所有类配备一个返回类名的虚拟名称方法

这意味着配置文件可以是

代码语言:javascript
运行
复制
virtual const char * name();

代码语言:javascript
运行
复制
virtual const char * name() const;

代码语言:javascript
运行
复制
virtual std::string name();

代码语言:javascript
运行
复制
virtual std::string name() const;

但不是virtual void name()

(

a)定义类,假设A类是抽象类

因此,至少有一个方法必须是抽象的,通常情况下,这是名称。

用于以下继承方案的

:→B→C

可能是因为我为我做了UML,箭头的方向是错误的,但是A是抽象的,很可能是C继承了继承(实现)A的B

c)添加虚拟析构函数

这是微不足道的,但不要忘记实现它们,而不仅仅是声明它们。

d)添加A类的全局函数朋友,以便它能够执行与点b中相同的功能

这通常意味着函数获得对A的引用,在您的情况下请注意声明和定义不对应,参数列表(&A)无效

一个例子可以是:

代码语言:javascript
运行
复制
#include <iostream>

class A {
  public:
    // default contructor is enough
    virtual ~A() {} // c)

    virtual const char * name() const = 0; // a) and b)

    friend const char * ffriend(const A &); // d)
};

const char * ffriend(const A & a)
{
  return a.name(); // or return "A" ?
}


class B : public A {
  public:
    // default contructor is enough
    virtual ~B() {} // c)

    virtual const char * name() const { return "B"; } // b)

};

class C : public B {
  public:
    // default contructor is enough
    virtual ~C() {}

    virtual const char * name() const { return "C"; } // b)
};


int main()
{
  B b;
  C c;

  std::cout << b.name() << ' ' << c.name() << ' ' << ffriend(b) << std::endl;
}

汇编和执行:

代码语言:javascript
运行
复制
pi@raspberrypi:/tmp $ g++ -Wall c.cc
pi@raspberrypi:/tmp $ ./a.out
B C B
pi@raspberrypi:/tmp $ 

现在还不清楚朋友函数要返回什么名字,我认为是真实的类名,但也可以是"A“。

注在A中,方法名可以是私有的,如果我可以这样说的话,可以证明朋友方法的存在是正确的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62157717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档