我有一个基类数组和一个派生类NumericArray
class Array{//Array.h
private: int size;
public: Array();//Default constructor
Array(int index);// Initialize with size
GetSize();//getter function
};
class NumericArray:public Array
{//NumericArray.h
public: NumericArray();//Default constructor
如果我是正确的,默认析构函数总是隐式声明的,除非用户声明它。根据
通过指向基的指针删除对象会调用未定义的行为,除非基类中的析构函数是虚拟的。
现在,考虑下面的示例:
struct B {};
struct D : B {};
隐式声明的析构函数B::~B()是虚拟的吗?如果没有,那么在使用继承时,应该始终声明一个虚拟析构函数吗?
静态成员函数和全局函数有什么不同?
void globalFunc()
{
}
class Test
{
public:
//In grammar side, object's not own this function
static void staticFunc();
};
静态成员函数是全局函数,但它可以按意义进行分类,限制访问范围。
但是我不明白为什么静态成员函数的调用约定是这个调用。
我理解普通成员函数必须是这个调用,因为它必须需要调用者对象的地址,但是,为什么静态成员函数有这个调用约定呢?我认为它不需要调用者的地址,因为它不是对象的函数。静态成员函数
我想要编译这个程序,然后打印下面的输出:
public interface IFoo
{
void Bar();
}
public class FooBase : IFoo
{
void IFoo.Bar()
{
Console.WriteLine("Hello from base class.");
}
}
public class Foo : FooBase, IFoo
{
void IFoo.Bar()
{
(base as IFoo).Bar(); // doesn't comp
这里没有问题,只是需要解释一下它是如何工作的。
我当时正在为我的C#课做作业,我通过遵循教授提供的代码示例,自己做了这件事。问题是我不明白它是怎么工作的。以下是困扰我的一些事情:
首先,为什么我需要使用xmlBook.Title = "XML Primer Plus";而不是Book clrBook = new Book("CLR via C#", ..."),反之亦然。
第二,为什么我在使用: base()时不需要任何参数
第三,如何使用new public void display()覆盖只添加输出,而不是完全修改原始protected void d
在查看下面的简单代码时,如果我知道我们没有从基本指针中删除,那么引入虚拟析构函数是否有意义?如果可能的话,出于性能原因,我们应该尽量避免vtable查找。我理解早期优化等,但这只是一个一般的问题。我想知道你对以下几点的看法:
如果没有通过基指针删除项,则使用受保护的析构函数。
引入单个虚拟方法的相关开销。
另外,如果我的类只将析构函数作为虚拟方法,那么查找开销是否仅用于析构函数方法,其他方法不会招致惩罚,或者一旦引入vptr,一切都会受到影响吗?我假设每个类都有一个额外的vptr,但是它只需要在析构函数上执行vptr查找。
class CardPlayer
{
public
我尝试了一个多态性示例,但在我的代码中得到了以下错误:
public class CPolygon
{
CPolygon() {}
public int width {get; set;}
public int height {get; set;}
public virtual int area(){ return 0; }
}
class CRectangle: CPolygon
{
public CRectangle() {} //'Lista.CPolygon.CPolygon()' is inacce
我被C#中的C#关键字搞糊涂了。假设我有这样的代码:
class A
{
// member declaration....
A(int s, int t, int x)
{
// assign the values of members
}
}
class B : A
{
// member declaration....
B(int a, int b, int c, int d) : base(a,b,c)
{
// does the base keyword play a role in
我有点困惑于基类中的属性设置器的封装。
如果其中一些属性是在基本构造函数中设置的,那么setter应该是私有的还是受保护的?
如果其中一些属性是在子构造函数中设置的,那么setter应该是私有的还是受保护的?
为了更清楚地说明,这里有一个具体案例:
public abstract class Records
{
public string Date { get; protected set; }
public string Source { get; protected set; }
public string Type { get; protected
Java -我有一个抽象的基类,我想从子类中设置一些基类的属性。做这件事最好的方法是什么?将属性设置为受保护?在基类中创建setter?
public abstract class A {
protected String tag;
protected String apiUrl;
// Setter
public void setApiUri(String url) {
this.apiUrl = url;
}
}
public class B extends A {
tag = "Class B";
apiUrl =
我想断言基类仅是继承的私有类。
class Base {
static_assert(...); //check if its derived privat
};
class PublicDerived : public Base {}; //this should fail
class PrivateDerived : private Base {}; //this should work
有办法做到这一点吗?
基类也可以是模板类。
我肯定这个问题在别的地方,但找不到。
我有一个抽象类,它将成为其他类的基础。希望基类的基本构造函数不可访问,而子类无法编辑行为,迫使它们使用另一个构造函数。
public abstract class BaseClass
{
protected int X;
private BaseClass() { } // Problematic accessor
public BaseClass(int x)
{
X = x;
}
}
public class Child : BaseClass
{
public Child(int x)
请有人给我指点一下C++标准的相应段落,或者如果我取消对文本({123})的注释,可以提供一些解释为什么我的代码不编译吗?
一般来说,我理解通过初始化程序列表使用默认成员初始化和初始化有什么问题,但我不能引用确切的原因。
enum class MY: int
{
A = 1
};
struct abc
{
int a;/*{123};*/ //compilation failed if uncommented
MY m;
};
abc a = {1, MY::A};
编译器错误,在未注释文本的情况下:
错误:无法将“{1,A}”从“”转换为“abc”
例如,我有一个基类A:
class A {
public:
callA() {
val = 100;
std::cout << this->val << std::endl;
}
int val;
}
class B : public A {
public:
B() {
val = 10;
}
int val;
}
B b;
b.callA();
b.callA()将打印什么?
对于继承A的B,如果B没有字段val,B会共享对A的val的确切引用,还是它是一
当我们想要控制对象的实例化时,我们通常将构造函数设置为私有或内部构造函数:
public class A {
private A(int aParam) { }
}
然而,这与密封类'A‘本质上是一样的,因为现在没有人可以继承它。
因此,我们可以保护构造函数:
public class A {
protected A(int aParam) { }
}
public class B {
protected B(int aParam) : base(aParam) { }
}
但是,这意味着来自B的任何代码(或从中派生的任何类)都可以实例化一个新的A。
我正在寻找
类的子类可以访问派生类的对象的数据成员吗?
例如,我有这个代码。
class word
{
protected:
char * a_word;
word * next;
};
class texting : public word
{
public:
word * checkPhrase(char * token, word * curr);
};
word * texting::checkPhrase(char * token, word * curr)
{
if (curr)
{
if (strcmp(token, a_word)
class Base
{
virtual void bePolymorphic() = 0; // Will never be used
};
class Derived : Base
{
virtual void bePolymorphic() override {}; // I have to do this in every derived class
};
如果Base没有任何成员函数的话,这就是我最近使用的使它成为抽象类的黑客攻击。
在Java中有一个abstract关键字。为什么C++里没有一个?还有其他方法使类抽象吗?
我是C++的新手。
class A
{
public:
int i;
protected: //**--- [1]**
void set()
{
i=5;
cout<<i;
}
};
class B : public A
{
public:
void call()
{
A obj;
obj.set(); //**----[2]**
set()
我需要在House类中设置来自住宅类的3个值,但是它给出了不能调用受保护的构造函数的错误
class Dwelling {
int bedrooms;
protected:
Dwelling(){bedrooms=0;};
Dwelling(int _b){bedrooms=_b;};
};
class House : public Dwelling {
int storeys;
bool garden;
public:
House() {storeys=0; garden=0;};
//constructor to set store
我正在尝试做的是创建一个基类,从它派生的任何东西都将自动注册到另一个类,例如:
class System;
class Object
{
public:
Object()
{
System sys;
sys.AddObject(this);
}
virtual ~Object()
{
System sys;
sys.RemoveObject(this);
}
};
class System
{
public:
// Some other processing function
我有两个类:
class A {
public:
virtual void somefunction() = 0;
};
class B : public A {
public:
B();
~B();
void somefunction();
};
B::B() {}
void B::somefunction() {
// some code
}
但是在使用g++时,我得到了错误:
class A has virtual functions and accessible non-virtual destructor
class B has vir
当父类受到保护时,我有一个关于继承类上的默认构造函数的问题,在我看来,子类也会有一个默认的构造函数保护,但事实并非如此。
是否有一种方法可以强制默认构造函数受到保护,而不是强制它在子类上呢?
C++11 - gcc版本5.3.1 20151219 (Debian5.3.1-4).
int main ( int argc, char ** argv )
{
using namespace std;
class A
{
public:
static std::shared_ptr<A> CreateInstance ()
我不明白以下的限制:
class Base
{
virtual doFoo() = 0;
};
class Derived : public Base
{
public:
void doStuff() { doFoo(); } //compile error, doFoo is a private member of Base
};
当然,解决方案是重新声明派生类中的成员,但我觉得有些奇怪:
class Derived : public Base
{
public:
void doStuff() { doFoo(); }
private:
v
我在尝试迁移到C++17时遇到了一个奇怪的问题,问题是在C++17中发生了一些变化(我不确定),在默认构造函数的情况下,列表初始化的工作方式有所不同。我试图搜索以获得更多信息,但我没有找到任何看起来相关的信息。
有人知道下面的代码在调用C++14而不是B()时在C++17中编译的原因吗?(我在gcc 8.2和7.3以及icc 19上都试过了)
struct A{
protected:
A() {}
};
struct B : public A {};
B f(){
return B(); //compilation OK
//return B{}; //compi