相关疑难解决方法(0)

将模板参数设为朋友?

例:

template<class T>
class Base {
public:
    Base();
    friend class T;
};
Run Code Online (Sandbox Code Playgroud)

现在这不起作用......有没有办法做到这一点?

我实际上是想制作一个像这样的通用类封口机:

class ClassSealer {
private:
   friend class Sealed;
   ClassSealer() {}
};
class Sealed : private virtual ClassSealer
{ 
   // ...
};
class FailsToDerive : public Sealed
{
   // Cannot be instantiated
};
Run Code Online (Sandbox Code Playgroud)

我在这个网站上找到了这个例子,但我找不到它...(这里)

我知道还有其他方法可以做到这一点但是现在我很好奇你是否真的能做到这样的事情.

c++ templates friend

38
推荐指数
2
解决办法
9406
查看次数

如何从std :: ostream继承?

我一直在谷歌搜索,我只是找不到一个简单的答案.它应该很简单,就像STL一般.

我想定义从std :: ostream公开继承的MyOStream.假设我想在每次将某些内容写入流中时调用foo().

class MyOStream : public ostream {
public:
  ...
private:
   void foo() { ... }
}
Run Code Online (Sandbox Code Playgroud)

我知道ostream的公共接口是非虚拟的,那怎么办呢?我希望客户能够在MyOStream上使用operator <<和write()以及put()并使用我的类的扩展功能.

inheritance stl ostream

35
推荐指数
4
解决办法
2万
查看次数

C++中的公共和私有继承

正如我们从文献中了解到的公共继承一样,子类(子类)的对象也可以被视为基类(超类)的对象.为什么当继承受到保护或私有时,子类的对象不能被视为超类的对象?

c++ inheritance private protected

12
推荐指数
5
解决办法
2万
查看次数

C++为什么要使用公共,私有或受保护的继承?

那么有关于这个主题的足够信息.例如,这个线程对我来说非常清楚:私有,公共和受保护的继承之间的区别

除了一点; 为什么有用?

c++ inheritance private protected public

12
推荐指数
1
解决办法
9938
查看次数

是否有可能在编译时禁止从类派生?

根据"C++编码标准"第32项中的描述,我有一个值类.简而言之,这意味着它提供了值语义,并且没有任何虚方法.

我不希望一个类派生自这个类.除了其他人之外,一个原因是它有一个公共的非虚拟析构函数.但是,基类应该具有公共和虚拟或受保护和非虚拟的析构函数.

我不知道写值类的可能性,因此不可能从中派生出来.我想在编译时禁止它.是否有任何已知的成语可以做到这一点?如果没有,或许在即将到来的C++ 0x中有一些新的可能性?还是有充分的理由说没有这种可能性?

c++

11
推荐指数
3
解决办法
2479
查看次数

在实践中使用非公共C++继承的频率是多少?

可能重复:
我什么时候应该使用C++私有继承?

我想制作这个社区维基但没有看到按钮......有人可以添加它吗?

我无法想到我是以非公开的方式从一个类派生出来的,而且我无法回想起看到这样做的代码.

我想听一下它有用的真实世界的例子和模式.

c++ inheritance

7
推荐指数
1
解决办法
1296
查看次数

为什么在私有继承下覆盖?

class Base {
public:
   virtual void f() {}
};

class Derived : private Base {
public:
   void f() override {}
};
Run Code Online (Sandbox Code Playgroud)

我的问题是这样的覆盖是否有用?私有继承意味着您不能存储DerivedBase指针中,因此永远不需要动态分派f到正确的类型.

c++ c++11

7
推荐指数
1
解决办法
249
查看次数

使用组合而不是继承转发方法(使用C++特征)

我想使用组合并使用C++功能为每个可能的重载(noexcept,const,volatile)编写好的转发方法.

我们的想法是使用traits来确定方法是否被声明{noexcept/const/volatile/etc.}并相应地表现.

这是我想要实现的一个例子:

struct User{    
    UsedObject& obj;
    User(UsedObject& obj) : obj(obj) {}

    FORWARD_METHOD(obj, get); //here is where the forwarding happens
};

struct UsedObject{
    string m{"Hello\n"};

    string& get(double d){
        cout << "\tUsed :const not called...\n";
        return m;
    }
    const string& get(double d) const{
        cout << "\tUsed :const called...\n";
        return m;
    }
};
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止**:

// forward with noexcept attribute
// I'm not 100% sure about : std::declval<std::add_lvalue_reference<decltype(obj)>::type

template<typename... Args>
constexpr decltype(auto) get(Args && ... args)
noexcept(
         noexcept(std::declval<std::add_lvalue_reference<decltype(obj)>::type>().get(  std::forward<Args>(args)...  ))
         and
         std::is_nothrow_move_constructible<decltype( std::declval<std::add_lvalue_reference<decltype(obj)>::type>().get( …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance templates metaprogramming composition

5
推荐指数
1
解决办法
992
查看次数

C++父类对齐

是否可以指定父类的对齐?例如像(没有编译)的东西:

template<size_t n>
class Vector : public boost::array<double,n> __attribute__ ((aligned(16)))
{
Run Code Online (Sandbox Code Playgroud)

谢谢

好吧,从我收集的评论来看,这不是一个好方法.我想我会坚持私有数组的组合/对齐

c++ inheritance alignment

3
推荐指数
1
解决办法
1335
查看次数

什么是私有继承,它解决了哪些问题?

有人可以解释一下C++中究竟是私有/受保护的继承是什么,以及它要解决的问题是什么?

class Bar { };
class Foo : private Bar { };
Run Code Online (Sandbox Code Playgroud)

我已经看过这个问题,但我仍然不明白它什么,更何况我应该使用它.

(与Java/C#或类似语言中的功能比较也可能有所帮助.)

c++ inheritance private-inheritance

3
推荐指数
1
解决办法
528
查看次数

多级继承成员访问

我正在学习OOP,似乎遇到了问题。
代码:

class line {
protected:
    double a;
public:

    line() {a = 1;}
    line(double var1) {a = var1;}
};

class rectangle: private line {
protected:
    double b;
public:
    double area() {return a * b;}

    rectangle():line() {b = 1;}
    rectangle(double var1):line(var1) {b = var1;}
    rectangle(double var1, double var2):line(var1) {b = var2;}
};

class parallelepiped: private rectangle{
private:
    double c;
public:
    double volume() {return area() * c;}
    void print() {  cout << "Parallelepiped rectangle information:" << endl;
                    cout << "a = " …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance c++11

3
推荐指数
1
解决办法
444
查看次数

使用基类对象来表示其派生类对象

我需要一种方法让单个变量表示从同一基类派生的两种对象.

这有点难以描述,但我会尽力而为:

说基类:

class Rectangle
{
   float w;
   float h;
   const float area() {return w*h;}
};
Run Code Online (Sandbox Code Playgroud)

以及两个派生类:

class Poker : Rectangle
{
    int style;  // Diamond, Club, ....
    int point;  // A~10, J, Q, K
};

class BusinessCard : Rectangle
{
    string name;
    string address;
    string phone;
};
Run Code Online (Sandbox Code Playgroud)

现在可以声明一个对象,可以是扑克牌还是名片?

'因为下面的用法是非法的:

Rectangle* rec;
rec = new Poker();
delete rec;
rec = new BusinessCard();
Run Code Online (Sandbox Code Playgroud)

多态可能是一种方式,但由于它只对改变基类的成员属性有好处,我需要这个对象能够准确地表示任何一个派生对象.

编辑:

谢谢你的所有答案.公共继承,虚拟析构函数甚至boost :: variant typedef都是很棒的提示.

c++

2
推荐指数
1
解决办法
420
查看次数

多态性-&gt;错误:“没有已知的从派生类到基类的转换”

我怎样才能做到这一点:

class Base
{
public:
    int a, b, c;
    void function();
    ...
};

class Derived1 : 
    private Base
{
public:
    int d, e, f;
    ...
};

class Derived2 :
    private Base
{
public:
    void addObject(const Base* obj);
    ...
};
Run Code Online (Sandbox Code Playgroud)

请注意,我将其继承为私有


然后我想做这样的事情:

Base* d1 = new Derived1();
Base* d2 = new Derived2();

d2->addObject(d1);
Run Code Online (Sandbox Code Playgroud)

这是我从编译器那里得到的相关问题:

C:\test\test.cpp||In function 'void init()':|
C:\test\test.cpp|423|error: no matching function for call to 'Derived2::addObject(const Base*)'|
C:\test\test.cpp|423|note: candidate is:|
C:\test\test.h|29|note: void Derived2::addObject(const Base*)|
C:\test\test.h|29|note:   no known conversion for argument …
Run Code Online (Sandbox Code Playgroud)

c++ polymorphism inheritance

2
推荐指数
1
解决办法
6985
查看次数