在派生类的方法中使用基类的方法

时间:2015-05-09 08:05:39

标签: c++ inheritance method-call

我对继承的理解很差,我似乎无法找到我正在寻找的答案。我为这篇文章的篇幅道歉,但我觉得我需要非常具体。

我有一个基类“ProgCtl”,它可以向进程发送信号。我有一个名为“Beeper”的简单程序,它只能永远运行,发出“嘟嘟声!”每隔10秒发出一次消息我负责制作的派生类“BeepCtrl”旨在专门发送信号并对蜂鸣器程序进行更改。

我的问题是:我无法弄清楚如何从BeepCtrl中的方法访问ProgCtl的方法和变量。主要在BeepCtrl.cpp中,我必须使用ProgCtl的alive和send方法来检查进程是否存在并结束它。

是我的beep构造函数的ProgCtl扩展甚至做了什么?我的笔记只说这允许我设置属性值。我真的很抱歉。我知道在这里尝试不止一个问题(和广泛的问题)是不好的礼节,但我真的迷路了。

ProgCtl.hpp

#ifndef  PROGCTL_HPP
#define PROGCTL_HPP

#include <stdlib.h>
#include <unistd.h>
#include <string>

class ProgCtl {
    private:
      std::string   m_program;
      pid_t         m_pid;

      void          find_pid();

    public:
      // Constructors
      ProgCtl():m_program(""),m_pid(-1){}
      ProgCtl(std::string prog):m_program(prog),m_pid(-1){}
      ProgCtl(char *prog):m_pid(-1) {
          m_program = std::string(prog);
      }
      // Setters
      void       setName(std::string prog);
      void       setName(char *prog);
      void       setPid(pid_t pid){m_pid = pid;}
      // Other
      bool       alive();
      int        send(int sig);
      int        start();
};

#endif

BeepCtrl.hpp;由于这个根本问题,远未完成

#ifndef BeepCtrl_HPP
#define BeepCtrl_HPP
#include "ProgCtl.hpp"
#include <string>
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <iostream>
class BeepCtrl: public ProgCtl{

public:
    BeepCtrl(std::string name):ProgCtl(name){};
    BeepCtrl():ProgCtl(){};
    BeepCtrl(char *prog):ProgCtl(prog){};
    void stop(); //if alive, send kill
    void beep_faster(); //test if beeper is alive then decrement inveral
    void beep_slower(); // increment interval
};
#endif

BeepCtrl.cpp

#include "BeepCtrl.hpp"

void stop() //if alive, send kill
{
    //std::set_terminate(std::cerr << "terminate handler called\n");
    if(alive()){//---alive and send not declared in this scope---
        send(9);
    }
    else{
    throw 0;
    }
}
void beep_faster() //test if beeper is alive then decrement inveral
{
//throw if an invalid value
}
void beep_slower() // increment interval
{
//throw if an invalid value
}

2 个答案:

答案 0 :(得分:2)

您应该在cpp文件中为方法指定类:

void BeepCtrl::stop() //if alive, send kill
{
    //std::set_terminate(std::cerr << "terminate handler called\n");
    if(alive()){//---alive and send not declared in this scope---
        send(9);
    }
    else{
    throw 0;
    }
}

答案 1 :(得分:0)

修改 这回答我无法弄清楚如何从BeepCtrl 中的方法访问ProgCtl的方法和变量。实际的编译问题由@ Sergi0解决。

派生类应该可以访问的基类成员应该声明为protected而不是private

class ProgCtl {
    protected:
      std::string   m_program;
      pid_t         m_pid;

      void          find_pid();

    public:
      // Constructors
      ...
};

仍然无法从外部访问受保护的名称,但子类可以访问它们。

当你继承一个类时会发生类似的事情:

class BeepCtrl: public ProgCtl { ... }

此处,通过ProgCtl类型的对象对BeepCtrl的公共名称的访问权将保持不变。受保护的名称仍将受到保护。

class BeepCtrl: protected ProgCtl { ... }

此处,只能通过 ProgCtl中的函数访问BeepCtrl类型BeepCtrl对象的公共名称。

class BeepCtrl: private ProgCtl { ... }

此处,ProgCtl的任何名称都隐藏在BeepCtrl内外的地方。