C++抽象基类私人成员

问题描述:

只是想澄清一下。 抽象基类不应该有私人成员?例如C++抽象基类私人成员

class abc{ 
public: 
    virtual void foo()=0; 
private: 
    int myInt; 
} 

你永远无法访问敏,因为你不能创建ABC的一个实例,它不会是因为其私人派生类。 有没有什么情况下你会在抽象基类中使用私有成员,或者这只是错误的?

+0

像那样的私有成员没有意义的抽象类,只是因为它没有任何意义在*任何其他*类。 – 2011-04-06 15:46:21

+0

@MartinhoFernandes:你是说私人数据成员从来没有意义,或者你是在说'int'还是'myInt'? – 2011-04-06 15:57:59

+0

我在说私人数据成员没有使用*任何地方*没有意义。'class abc {public:virtual void foo(){};/*不再抽象*/private:int myInt;'不会使myInt更有用。 – 2011-04-06 16:00:22

在C++中,您可以拥有一个具有非纯虚拟方法的抽象类。在这种情况下,并根据设计它可以使意义有私有成员:

class base { 
    std::string name; 
public: 
    base(std::string const & n) : name(n) {} 
    std::string const & getName() const { return name; } 

    virtual void foo() = 0; 
}; 

该代码可以确保每一个从基础派生对象都有一个名字,那就是施工期间设置,从不在一生中改变的对象。

编辑:对于完成后,查尔斯·贝利在提醒我的是他的answer

您还可以定义纯虚功能,并且在这种情况下,私有属性也有道理:

// with the above definition of base 
void base::foo() { 
    std::cout << "My name is " << name << std::endl; 
} 

就目前来看,你的例子没有意义。

但是,抽象基类允许拥有成员函数定义,而后者又可以访问基类中的私有成员数据。

并非抽象基类中的所有方法都必须是纯虚拟的。你可能有一些对所有子类都有用的方法。因此,如果您在修改内部状态的基类中具有某些功能,那么您将拥有这些私有成员。

通常不建议将数据成员放在抽象类中,但在示例中没有任何技术上的错误。在公开访问的foo的实施中,您可以使用myInt用于任何您喜欢的目的。

例如:

class abc{ 
public: 
    virtual void foo()=0; 
private: 
    int myInt; 
}; 

class xyz : public abc 
{ 
    virtual void foo(); 
}; 

#include <iostream> 
#include <ostream> 

void xyz::foo() 
{ 
    std::cout << "xyz::foo()\n"; 
    abc::foo(); 
} 

void abc::foo() 
{ 
    std::cout << "abc::foo(): " << myInt++ << '\n'; 
} 

#include <memory> 

int main() 
{ 
    std::auto_ptr<abc> p(new xyz()); // value-initialization important 
    p->foo(); 
    p->foo(); 
} 

输出:

xyz::foo() 
abc::foo(): 0 
xyz::foo() 
abc::foo(): 1 
+0

你没有在'''abc'''构造函数中初始化'''myInt'''变量 - 这是正常的吗? :) – isnullxbh 2017-02-20 09:24:35

如果使用Template Method design pattern(实施open/closed principle),这是很常见的有一个抽象基类的private成员。

您可以通过此快捷方式

代码是在PHP访问私有成员

abstract class myclass1 
{ 
      private $var="46789"; 
     public function test($valuetoset) 
     { 
      echo $this->var = $valuetoset; 

     } 
} 

class myclass2 extends myclass1 
{ 


} 

$obj = new myclass2(); 
$obj->test(78);